Копировать и архивировать каталоги и только файлы старше x дней

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