Архивировать/сжимать файлы, измененные за последний день

Я действительно новичок в Powershell и сценариях и был бы очень признателен, если бы кто-нибудь мог помочь.

Я пытаюсь создать сценарий PowerShell, который выполняет следующие действия для ежедневного резервного копирования любых изменений в заданном количестве каталогов.

  • Рекурсивный поиск любых новых/измененных файлов или каталогов из нескольких предустановленных местоположений только за последние 24 часа.

  • Сжать все полученные записи в zip-файл

  • при сохранении структуры папок

Мне удалось найти работу с первым битом, используя следующий скрипт:

Get-ChildItem $SRC | Where {$_.PsIsContainer} | foreach-object {
  Get-ChildItem $_ -Recurse -ErrorAction SilentlyContinue | 
  Where {$_.LastWriteTime -gt (get-date).AddDays(-1).date} |
  Select FullName, LastWriteTime, Mode | Sort LastWriteTime, Mode
} >> C:\temp\LastModified-$TimeStamp.log

У меня есть другой скрипт, который заархивирует заданный каталог, но я изо всех сил пытался использовать результаты из приведенного выше скрипта, чтобы либо робокопировать файлы в место, которое я могу затем заархивировать, либо если есть способ создать zip-файл без необходимости сначала скопировать файлы куда-нибудь, не теряя структуру папок для каждого файла?

У меня есть следующий скрипт, который может заархивировать заданный каталог (но мне нужно заархивировать несколько каталогов в один zip-файл, если я сначала не скопирую файлы куда-нибудь и как мне заставить robocopy копировать только файлы, измененные за последние 24 часа)

$Source =  'C:\Users\Downloads\RobocopyLocation\'
$Destination = 'D:\OneDrive\'
$TimeStamp = Get-Date -f yyyyMMdd_HHmmss
$ZipName = "$Destination\$TimeStamp" + '_Backup.zip '

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory($Source, $ZipName)

Когда я запускаю скрипт ниже, я получаю сообщение об ошибке, жалующееся на то, что аргумент пути равен нулю.

$F1 =  'C:\Users\Downloads\Folder A'
$F2 =  'C:\Users\Downloads\Folder B'
$F3 =  'C:\Users\Downloads\Folder C'
$SrcFolders = ($F1, $F2, $F3); 
$BackupDrive = "D:\OneDrive"
$DestFolders = ("$BackupDrive\Folder A", "$BackupDrive\Folder B", "$BackupDrive\Folder C"); 
$Destination = 'C:\Users\SysAdmin\Downloads\PLSWork\'
$TimeStamp = Get-Date -f yyyyMMdd_HHmmss
$ZipName = "$Destination\$TimeStamp" + '_Backup.zip '
$Option = "{$_.PsIsContainer} | foreach-object { Get-ChildItem $_ -Recurse -ErrorAction SilentlyContinue | Where {$_.LastWriteTime -gt (get-date).AddDays(-1).date} | Select FullName, LastWriteTime, Mode | Sort LastWriteTime, Mode}"


Foreach ($SrcFolders in (Get-ChildItem $SrcFolders | where $Option)){


Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory($SrcFolders, $ZipName)
}

person Ped    schedule 25.12.2016    source источник


Ответы (2)


изменить свою линию

$ZipName = "$Destination\$TimeStamp" + '_Backup.zip '

с участием

$ZipName = "$Destination$TimeStamp" + '_Backup.zip '
person Esperento57    schedule 25.12.2016
comment
Я получаю сообщение об ошибке, жалующееся на то, что аргумент пути равен нулю - person 4c74356b41; 25.12.2016
comment
Не могли бы вы опубликовать ошибку? Нам нужно выяснить, где powershell выдает исключение Null. - person Ranadip Dutta; 26.12.2016

Как насчет чего-то подобного?

$RootPath = "P:\PSZip\"
$Folders = (
    "Folder A",
    "Folder B",
    "Folder C"
)
$BackupFolder = "P:\PSZip\Destination\"
$Files = @()

foreach($Folder in $Folders) { 
    $Files = Get-ChildItem ("{0}{1}\" -f $RootPath, $Folder) | Where {$_.PSIsContainer} | ForEach-Object { Get-ChildItem $_.FullName -Recurse | Where { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } } 
    $ZipName = ("{0}{1}\{2}_Backup.zip" -f $BackupFolder, $Folder, (Get-Date -f yyyyMMdd_HHmmss))
    Compress-Archive -Path $Files.FullName -DestinationPath $ZipName
}
person dbso    schedule 30.12.2016