首页 > 解决方案 > 从 Powershell 的压缩过程中排除文件夹

问题描述

我对 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 "XXX\7zip\7za.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

标签: powershellpowershell-2.0powershell-3.0powershell-4.0

解决方案


    $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 }

推荐阅读