Назад | Перейти на главную страницу

Powershell дождитесь завершения сжатия

Я написал сценарий PowerShell, который заархивирует содержимое папки и отправляет его на сервер для резервного копирования. Проблема в том, что процесс копирования не дожидается завершения процесса архивирования. Я пробовал использовать Out-Null и Wait-Process, и вроде ничего не работает. Out-Null просто ничего не делает, и Wait-Process говорит мне, что такого процесса не существует. Кажется, я не могу понять имя процесса для сжатия Windows. Любая помощь будет принята с благодарностью. Ниже приведена часть кода, которую я хотел бы приостановить, пока она не завершится.

function out-zip { 
Param([string]$path) 

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 
$ZipFile = (new-object -com shell.application).NameSpace($path) 
$input | foreach {$zipfile.CopyHere($_.fullname)} 
} 
gi "C:\File-Backups\Share1" | out-zip C:\File-Backups\transfer\PC1-Backup 

Вы уверены, что код действительно сжимает файлы в допустимый формат zip? Не похоже, что это приносит мне пользу. (edit: О, это так? Отлично!)

В любом случае, чтобы ответить на ваш вопрос, независимо от того, Out-Null ничего не делает, потому что это Out-Null ... и Wait-Process ничего не делает, потому что вы не запускаете процесс.

Вам нужны вакансии Powershell.

Start-Job

http://technet.microsoft.com/en-us/library/hh849698.aspx

Подождите-Job

http://technet.microsoft.com/en-us/library/hh849735.aspx

изменить 2: Кроме того, похоже, что вы используете Powershell v3!

[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$src_folder = "D:\stuff"
$destfile = "D:\stuff.zip"
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$includebasedir = $false
[System.IO.Compression.ZipFile]::CreateFromDirectory($src_folder,$destfile,$compressionLevel, $includebasedir )

Поместите foreach вокруг последней строки там, где это необходимо, чтобы заархивировать каждый из ваших файлов, или как вы хотите это сделать, затем оберните все это как входные данные для Start-Job.

Процесс сжатия - это проводник, оболочка Windows (так что вы не можете дождаться завершения процесса, потому что он всегда выполняется).

Вот сообщение в блоге с некоторым кодом, расширяющим ваш пример, и с использованием тестов блокировки файлов, чтобы определить, когда сжатие завершено:

http://www.technologytoolbox.com/blog/jjameson/archive/2012/02/28/zip-a-folder-using-powershell.aspx

В противном случае вы планируете использовать какую-то внешнюю zip-библиотеку для PowerShell, которая не использует проводник, или вызываете программу, такую ​​как клиент командной строки 7-Zip, для выполнения работы и ждете ее завершения.