#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. Очень полезно, Дэниел! Это сделало свое дело. Я вам очень признателен.