#powershell #powershell-4.0
#powershell #powershell-4.0
Вопрос:
Я провел поиск и попробовал. Я знаю, что я не очень хорош в powershell, но я начинаю понимать, что это невозможно.
Что я пытаюсь сделать, так это переместить все содержимое моего C:Data которым исполнилось X дней, и заархивируйте их.
Звучит просто .. НО если C:dataSubject содержит файлы с 2015 по текущий. Я хочу архивировать только файлы, которым исполнилось X дней. таким образом, новый архивный путь будет C:DataBackup и там он будет содержать все папки C:data но в них будут только файлы X-дневной давности..
Это то, что я использовал для копирования и архивирования папок / файлов, НО это не учитывает возраст.. ЕСЛИ бы это было так, я бы попросил его удалить файлы, которые он перемещает из C: data, поскольку они сейчас хранятся в резервной копии C:dataBackup
$sourcePath = "C:Data"
$path = "C:DataBackup"
$source = Get-ChildItem -Path $sourcePath -Directory
Add-Type -assembly "system.io.compression.filesystem"
Foreach ($s in $source)
{
$destination = Join-path -path $path -ChildPath "$($s.name).zip"
If(Test-path $destination) {Remove-item $destination}
[io.compression.zipfile]::CreateFromDirectory($s.fullname, $destination)}
Ответ №1:
Вы можете изменить свой скрипт следующим образом:
$sourcePath = "C:Userskim_pDownloads"
$path = "C:DataBackup"
$tempPath = "C:DataTemp"
# Any file younger than $limit will be excluded from the zip archive
$limit = (Get-Date).AddDays(-10)
$source = Get-ChildItem -Path $sourcePath -Directory
# Make sure the temporary folder doesn't exist
If(Test-path $tempPath) {Remove-item $tempPath -Recurse}
Add-Type -assembly "system.io.compression.filesystem"
Foreach ($s in $source)
{
$destination = Join-path -path $path -ChildPath "$($s.name).zip"
If(Test-path $destination) {Remove-item $destination}
# Create the temporary directory
New-Item $tempPath -Type Directory
# Copy files older than the date set in $limit to the temporary folder $tempPath
Get-ChildItem -Path $s.fullname -Recurse -Force | Where-Object { $_.CreationTime -lt $limit } | Copy-Item -Destination $tempPath
# Create the zip archive using the files copied to $tempPath
[io.compression.zipfile]::CreateFromDirectory($tempPath, $destination)
# Remove the temporary folder and all the files inside of it
Remove-item $tempPath -Recurse
# Remove the source files added to the archive
Get-ChildItem -Path $s.fullname -Recurse -Force | Where-Object { $_.CreationTime -lt $limit } | Remove-Item -Recurse -Force
}
Я добавил папку с именем $tempPath
, в которой хранятся файлы, которые будут добавлены в архив с помощью CreateFromDirectory
. Файлы старше некоторого определенного предела $limit
сначала копируются во временную папку $tempPath
, затем CreateFromDirectory
выполняются с $tempPath
в качестве аргумента.
Окончательно $tempPath
удалено, поскольку оно больше не требуется.
Пожалуйста, обратите внимание, прежде чем запускать это для любых файлов любой важности, выполните несколько простых тестов. В конце сценария будут удалены файлы, которые он архивировал ранее.
В моих собственных тестах это, казалось, работало, но я рекомендую вам также проверить это.
Комментарии:
1. Боже мой, это потрясающе. Большое вам за это спасибо. У меня был другой скрипт с временным каталогом, но я не мог понять, как удалить исходный файл и сохранить папку, и не думаю, что я когда-либо смог бы! Еще раз спасибо.
Ответ №2:
Если вы используете PowerShell версии 5.0 или выше, попробуйте это:
$sourcePath = "C:Userskim_pDownloads"
$tempPath = "C:DataBackup"
$limit = (Get-Date).AddDays(-10)
remove-item -Path $tempPath -Force -ErrorAction Ignore -Recurse
Get-ChildItem -Path $sourcePath -Recurse | Where {$_.PSISContainer -eq $true -or ($_.PSISContainer -eq $false -and $_.CreationTime -lt $limit) } | %{ Copy-Item $_.FullName -Destination $_.FullName.Replace($sourcePath, $tempPath) -Recurse -Force}
Get-ChildItem -Path $tempPath -Directory | %{Compress-Archive -Path $_.FullName -DestinationPath ($_.FullName ".zip"); remove-item -Path $_.FullName -Recurse -Force }