1. ホーム
  2. powershell

[解決済み] PowerShellから変数に格納されたコマンドを実行する

2022-04-23 14:55:07

質問

PowerShellでビルドして変数に格納したコマンドがあります。このコマンドは、次のコマンドを実行すると動作します。 ライトホスト にコピー&ペーストし、標準の cmd.exe ウィンドウに表示されます。

このコマンドをスクリプトの中から実行するにはどうしたらいいですか?

Invoke-CommandやInvoke-Expressionの組み合わせをいくつか試しましたが、うまくいきませんでした。

このように変数を構築しました。

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

この変数を画面に出力するとこのようになります。

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

解決方法は?

を使用しない別の方法を紹介します。 Invoke-Expression ただし、2つの変数 (command:stringとparameters:array)です。私はこれでうまくいきました。仮に 7z.exe がシステムパスにあります。

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

コマンドが既知で(7z.exe)、パラメータのみが可変の場合、以下のようになります。

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

ちなみに。 Invoke-Expression を1つのパラメータで指定した場合、私の場合、次のように動作します。

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

追伸:私は通常、パラメータ配列を使用する方法を好みます。 の式を作るより、プログラムで合成する方が簡単です。 Invoke-Expression .