Исключить папку из процесса архивирования в Powershell

#powershell #powershell-2.0 #powershell-3.0 #powershell-4.0

Вопрос:

Я не слишком хорошо знаком со сценариями Powershell и надеюсь, что вы сможете мне здесь помочь.

У меня есть этот код, который удаляет файлы » X » на несколько дней старше, стирает их и перемещает в другую папку. Это для оптимизации пространства.

Теперь в этом процессе мне нужно полностью пропустить папку, а не обрабатывать ее. Вот где мне нужна помощь, так как я не знаю, куда поставить условие пропуска.

Я знаю , что есть такие команды, как -notmatch , но немного запутался в размещении.

Код Ниже:

 param([string]$destination="XXX")

$source = "XXX"

$ErrorActionPreference = “SilentlyContinue" #to avoid printing non-terminating errors


Function Clean_Drive([string]$path){ #define the function
    
    $Target = $destination   "zip*"
    Write-Host "*****TESTING1*****" $Target

   [Reflection.Assembly]::LoadWithPartialName('System.IO.Compression')
    
    #Delete zip files older than 20 or more days
    if (Test-Path $Target){ 
        $lmt = (Get-Date).AddDays(-15)

       Write-Verbose -Verbose "Deleting zip files:"
       Get-ChildItem -Path $Target -Recurse -Force 
       Where-Object { ! $_.PSIsContainer -and $_.CreationTime -le $lmt } | 
       Remove-Item -Force -Verbose
    }

    $now=Get-Date 
    $files=Get-ChildItem -path $path -recurse -force -file 
    $files | Select-Object Name, fullname, CreationTime, LastWriteTime, LastAccessTime
    $files | Add-Member -MemberType ScriptProperty -Name Owner -Value { (Get-Acl $this.FullName).Owner }

    # Create a variable to store columns for report variable
    $stats = "" | select Run_date, Location_of_File, Filename, DaysOfFile, LastAccessTime, Owner

    $firstArchive = ""
    $zipfile_list = [System.Collections.ArrayList]::new();
    $zipfile_list2 = [System.Collections.ArrayList]::new();
    $zipfile_list3 = [System.Collections.ArrayList]::new();
    $finaL_outputzipfile = [System.Collections.ArrayList]::new();

    foreach ($file in $files) 
    
    
    {
               
                $day_file = [int]($now.subtract(($file.LastWriteTime))).days 
                $stats.Run_date = get-date   
                $source_file            = $file.fullname.replace($file.name, "") 
                $stats.Location_of_File = $file.fullname.replace($file.name, "") 
                $stats.DaysOfFile = $day_file
                $owner_name = @( $file.Owner.split("") )
                $stats.Owner = $owner_name[-1]
                $stats.Filename = $file.name
                $stats.LastAccessTime = [int]($now.subtract(($file.LastAccessTime))).days
                
                # Prepare file name for name of output zip file
                $separator = ““

                $output_reportFile = $destination   ""   "Report_For_Dropbox_$(get-date -f yyyy-MM-dd).csv "

                Export-Csv -Path $output_reportFile -InputObject $stats -Append

        #For files 3 or more days, prepare to zip it up
       # if ($stats.Filename -like  "*.mp4" -OR $stats.Filename -like  "*.mov"){
       #    write-host "*****Do not delete*****" $stats.Filename}
       # else{
        if ($stats.LastAccessTime -ge 3)  {                
                              
                     # add to array
                     $zipfile_list.Add($stats.Location_of_File)
                      
        }
       # }
    }

    write-host "*****ZIPFILE_LIST*****" $zipfile_list
    write-host " "
    
     #Select only distinct value in Array
    
   $zipfile_list2 =  $zipfile_list | select -Unique

   write-host "*****ZIPFILE_LIST UNIQUE*****" $zipfile_list2
   write-host "*****TESTING2*****" $zipfile_list2.count

   for ($i=1;$i -le $zipfile_list2.count; $i  ) { 
 
                $zipfile_list3  = $zipfile_list2[$i]
          
   }
    
    # de-dup again for the final list of directory to zip
    $final_zipfilelist =  $zipfile_list3 | select -Unique
    write-host "***Printing final zip list***" $final_zipfilelist

    write-host "*****TESTING3*****" $final_zipfilelist.count
    write-host " "
    
    
    # Start of zipping process
    # preparing the password
    $randomPassword = "XXX"


    for ($i=0;$i -le ($final_zipfilelist.count-1); $i  ) { 

        $output_zip_filename1 = $final_zipfilelist[$i].Replace(":", "")
        $output_zip_filename1 = $output_zip_filename1.Replace("", "_")
        $output_zip_filename1 = $output_zip_filename1.Replace(" ", "_")
        $output_zip_filename = $output_zip_filename1.substring(0, $output_zip_filename1.Length-1)

        write-host "***Output zip file name: ***" $output_zip_filename
        write-host " "

        $ZipOutputFilePath = "$($destination  "zip"   “OUTPUT_ARCHIVE_FOR_”   $output_zip_filename   ".zip")"
        $FilesToZip = $final_zipfilelist[$i]    "*"


        $arguments = "a -tzip ""$ZipOutputFilePath"" ""$FilesToZip"" -mx9 -p$randomPassword"
        $windowStyle = "Normal"

        $p = Start-Process "XXX7zip7za.exe" -ArgumentList $arguments -Wait -PassThru -WindowStyle $windowStyle

        $output_zip_filename1 = ""      
        
    }

    if (Test-Path $ZipOutputFilePath){
            for($i=0; $i -le $final_zipfilelist.Count; $i  ){
            Remove-Item -Path $final_zipfilelist[$i] -Recurse | where $stats.LastAccessTime -ge 3
            }
     }                               
   
}


Clean_Drive $source
 

Ответ №1:

     $now = Get-Date
    $files = Get-ChildItem -Path $path -Recurse -Force -File |
        # add exception here
        # where file's ($_) directory's name does not equal (-ne) 'SomeFolderName'
        Where-Object { $_.Directory.Name -ne 'SomeFolderName' }

    $files | Select-Object Name, fullname, CreationTime, LastWriteTime, LastAccessTime
    $files | Add-Member -MemberType ScriptProperty -Name Owner -Value { (Get-Acl $this.FullName).Owner }
 

Комментарии:

1. Очень полезно, Дэниел! Это сделало свое дело. Я вам очень признателен.