PowerShell start-process と invoke-command を使用してファイルをリモートで圧縮する
-
27-10-2019 - |
質問
システムにリモート接続して、そこでファイルを圧縮または解凍し、プロセスが完了したときに通知できるようにしたいと考えています。Start-process は -wait パラメーターと連携して、PowerShell から 7z.exe を同期的に実行します。これを 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
所属していません StackOverflow