Удаленное архивирование файлов с помощью PowerShell start-process и invoke-command
-
27-10-2019 - |
Вопрос
Я хочу иметь возможность удаленно входить в систему, архивировать или распаковывать там файлы и получать сигнал процесса, когда он будет завершен.Запускающий процесс работает с параметром -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
Буду признателен за любую помощь или указания.
Спасибо, Грегори
Решение
Поскольку Start-Process здесь будет использоваться синхронно, я бы рекомендовал избегать этого и просто использовать 7z.exe
исполняемый файл:
$sevenZip = "C:\Program Files\7-zip\7z.exe"
&$sevenZip a $zipFileName $dirToZip
Это, естественно, заблокирует ваш скрипт до тех пор, пока 7zip не завершит свою работу.
Другие советы
Использование 7z.exe напрямую сделало бы свое дело.Если вы обнаружите, что вам нужно распаковать молнию защищенный паролем файл, который вы могли бы использовать:
$sevenZip = "C:\Program Files\7-zip\7z.exe"
&$sevenZip e -y "-o$dirToUnZip" -psomepassword $dirToUnZip\$zipFileName