Удаленно архивировать файлы с помощью PowerShell start-process и invoke-command - PullRequest
5 голосов
/ 07 сентября 2011

Я хочу иметь возможность удаленно входить в систему, архивировать или распаковывать файлы и получать сигнал процесса, когда он будет завершен. Запуск-процесс работает с параметром -wait для синхронного запуска 7z.exe из PowerShell. Когда я пытаюсь объединить это с invoke-command для удаленного выполнения этой же команды, он не учитывает параметр wait, и я считаю, что он убивает процесс, поскольку он быстро возвращается и никогда не создает zip-файл.

[string]$sevenZip = "C:\Program Files\7-zip\7z.exe"
[Array]$arguments = "a", $zipFilename, $dirToZip;

"Starting $sevenZip with $arguments"
Start-Process $sevenZip "$arguments" -Wait
#blocks and waits for zip file to complete

Первоначально я пробовал PSCX write-zip & expand-archive, но последний не совместим с 64-битной конфигурацией .NET 4.0. Поэтому сейчас я пытаюсь вызвать 64-битный 7z.exe через командную строку. Я не получаю никаких ошибок. PowerShell сообщает о задании как о состоянии выполнения, а затем о завершении, и файл zip не создается.

Invoke-Command -ComputerName localhost -FilePath 'C:\Scripts\ZipIt.ps1' -ArgumentList    'd:\TestFolder','d:\promote\TestFile.7z' -AsJob

Ценю любую помощь или указатели.

Спасибо, Gregory

Ответы [ 2 ]

5 голосов
/ 07 сентября 2011

Поскольку здесь Start-Process будет использоваться синхронно, я бы рекомендовал избегать его и просто использовать исполняемый файл 7z.exe:

$sevenZip = "C:\Program Files\7-zip\7z.exe"
&$sevenZip a $zipFileName $dirToZip

Это естественным образом заблокирует ваш скрипт, пока 7zip не завершит свою работу.

0 голосов
/ 29 марта 2016

Использование 7z.exe напрямую поможет. Если вам нужно распаковать файл, защищенный паролем, вы можете использовать:

$sevenZip = "C:\Program Files\7-zip\7z.exe"
&$sevenZip e -y  "-o$dirToUnZip" -psomepassword $dirToUnZip\$zipFileName 
...