2011-07-06 12 views
22

powershellを使用すると、 '&'文字を使用して別のアプリケーションを実行し、パラメータを渡すことができます。コマンドラインコマンドを動的に生成し、powershellを使用して呼び出します。

単純な例です。

$notepad = 'notepad' 
$fileName = 'HelloWorld.txt' 

# This will open HelloWorld.txt 
& $notepad $fileName 

これは良好です。しかし、ビジネスロジックを使用してコマンド文字列を動的に生成したい場合はどうすればよいですか?同じ単純な例を使用する:

$commandString = @('notepad', 'HelloWorld.txt') -join ' '; 
& $commandString 

を私はエラーを取得する:私の本当の例では

The term 'notepad HelloWorld.txt' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

私は動的に、最終的なコマンドライン文字列にオプションを追加または削除しようとしています。私はこれについて行くことができる方法はありますか?そうする

+0

は、二重引用符(「」)を支援して引用していますか? – cristobalito

答えて

25

二つの方法:引数からexeファイル

セパレート。は、引数のために、すべての動的なものを行うが、その後の引数を保持する変数で、通常のようexeファイルを呼び出す:

$argument= '"D:\spaced path\HelloWorld.txt"' 
$exe = 'notepad' 
&$exe $argument 

#or 
notepad $argument 

あなたが複数の引数を持っている場合、それは別のことになるならば、あなたはそれの配列にする必要があります呼び出しのexe部分から:

$arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2' 
$exe = 'notepad' 
&$exe $arguments 

Invoke-Expressionを使用します。すべてが文字列内になければならない場合、文字列を通常の式のように呼び出すことができます。 Invoke-Expressionの別名はiexです。いずれの場合においても

$exp = 'notepad "D:\spaced path\HelloWorld.txt"' 
Invoke-Expression $exp 

それはコマンドライン上で直線書き込まれたかのように、引数のとexeファイルの内容は、引用符で囲まれた、適切にフォーマットされなければなりません。

+1

また、1つの文字列内の引数を正しく引用する必要があることに注意してください。 – Joey

+0

ありがとうございます。この質問は私に3つの使用可能な選択肢を与えましたが、私は最終的に "引数からexeを分離する"パスに行きました。 –

+0

@Andrew:ほとんどの言語は他のプロセスを開始するために同様の分離を持っているので、ほとんどの場合、そのアプローチを使用します。 –

4

あなたの文字列を構築するためのそのロジックを維持したい場合:

$commandString = @('notepad', 'HelloWorld.txt') -join ' ' 

&([scriptblock]::create($commandstring)) 
関連する問題