PowerShellから変数に格納されたコマンドを実行する


152

PowerShellの変数にビルドして保存したコマンドがあります。このコマンドは、Write-Hostを実行し、コピーして標準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

回答:


206

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-Expression1つのパラメータを使用しても機能します。これは機能します。

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

Invoke-Expression $cmd

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


すばらしい。今、まとまり始めています。'c:\ temp \ with space \ test1.zip'の代わりに、単に$ variableを使用できますか?「」または「」を配置する必要がありますか?
トラビス

スプラッティングは同じように機能するようです:&$ cmd @prmしかし、それがなぜなのか私は知りたいです
C2H5OH

44

コマンドを呼び出してみてくださいInvoke-Expression

Invoke-Expression $cmd1

これが私のマシンでの動作例です:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iexある別名のためのInvoke-Expressionあなたが行うことができるように:

iex $cmd1

訪問:完全なリストについてはhttps://ss64.com/ps/多くのためPowershellのもの。

幸運を...


「7z.exe a -tzip c:\ arc_logs \ site-host-at-web1-100827.zip c:\ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log」という用語がaの名前として認識されないコマンドレット、関数、スクリプトファイル、または操作可能なプログラム。名前のスペルを確認するか、パスが含まれていた場合は、パスが正しいことを確認して、再試行してください。at:line:14 char:1 +&<<<< $ cmd1
Travis

@Travis:おっと。引数がない場合、アンパサンドは機能します。私はあなたの命令の解決策でポストを更新しました。
kbrimington 2010

以前にinvoke-expressionを試しましたが、うまくいきませんでした。それはエラーを吐き出します:悪い数値定数:7.:line:1 char:2 + 7z <<<< .exe a -tzip c:\ arc_logs \ site-host-at-web1-100827.zip c:\ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log実行するのではなく、評価しようとしているようです。
トラビス

@Travis:7z.exeがパス上にない可能性があります。パス上にあることを確認するか、式の実行可能ファイルにフルパス名を指定してください。
kbrimington 2010

1
@Travis:自分のシステムで、コマンドプロンプトから入力するだけで、7z.exeが説明したエラーを返す'C:\Program Files\7-zip\7z.exe'ことを確認しました。
kbrimington 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.