2016-10-22 8 views
0

У меня есть поиск, и я пробовал. Я знаю, что я не очень хорош в PowerShell, но я начинаю с того, что это невозможно.Копии и архивные каталоги и только файлы старше x Дней

То, что я пытаюсь сделать, - это переместить все содержимое моего C: \ Data, которое составляет X дней и архивирует их.

Звучит легко .. НО если C: \ data \ Subject содержит файлы с 2015 года по настоящее время. Я только хочу архивировать архивы, которым исполнилось X дней. поэтому новый архивный путь будет C: \ DataBackup, и там он будет содержать все папки C: \ data, но только файлы в них будут X дней.

Это то, что я использовал для копирования и архив папки/файлы, НО он не принимает во внимание возраст .. Если это так, я бы удалить файлы, которые он перемещает из C: данные, как они теперь backedup в 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)} 

ответ

2

Вы можете изменить сценарий следующим образом:

$sourcePath = "C:\Users\kim_p\Downloads" 
$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 удален, так как он больше не нужен.

Обратите внимание, что прежде чем запускать это в любых файлах любой важности, выполните некоторые простые тесты. В конце скрипта он удалит файлы, архивированные ранее.

В моих собственных тестах он работал, но я рекомендую вам также проверить это.

+0

Боже мой, что это удивительно. Спасибо вам большое за это. У меня был еще один скрипт с временным каталогом, но я не мог понять, как удалить исходный файл и сохранить папку, и не думаю, что когда-либо был! Еще раз спасибо. – JonnyBoy

1

Если вы используете PowerShell v5.0 или выше, попробуйте следующее:

$sourcePath = "C:\Users\kim_p\Downloads" 
    $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 }