Я написал сценарий 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, для выполнения работы и ждете ее завершения.