powershell - 从 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
解决方案
$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 }
推荐阅读
- c - 静态结构全局
- python-3.x - 如何从 thread.run 获取返回值
- powershell - 没有 OutFile 的调用 WebRequest?
- node.js - 即使我启用了 lib `es2019`,为什么我在 TypeScript 中没有可用的 Array.prototype.flat?
- python - 从一个范围内获取 n 个数字,包括 x
- macos - 如何在 macOS 上将“\x”插入到 hexdump 格式字符串中?
- spring - 遇到无效的@Scheduled 方法'methodName':只有无参数方法可以用@Scheduled 注释
- python - 计算缺失年份的同比值
- go - 如何在文件和结构中设置日期和日期数组
- python - 麻线上传区 收到错误“是版本的无效值”