2016-12-25 11 views
1

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

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

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

  • Сжать все полученные данные в виде архива

  • , сохраняя структуру папок

мне удалось найти получить первый бит работает с помощью следующего сценария:

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, либо если t вот способ создания zip-файла без необходимости копировать файлы где-то сначала без потери структуры папок для каждого файла?

У меня есть следующий скрипт, который может 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) 

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

$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) 
} 

ответ

1

изменить ваша линия

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

с

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

«Я получаю сообщение об ошибке и жалуюсь на то, что аргумент path равен нулю» – 4c74356b41

+0

Не могли бы вы выставить сообщение об ошибке? Нам нужно понять, что, когда powershell выбрасывает исключение Null. –

0

Как о чем-то вроде этого?

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