2017-02-15 24 views
0

スクリプト内の変数にコマンドを直接格納し、そのスクリプトの後半で同じコマンドを呼び出すとします。Powershell:スクリプト中に変数全体にコマンドを保存します。

私はこのようにそれを行うことを試み:その方法と

$command = Invoke-Command -ComputerName $Computer -Credential $Credential -ScriptBlock{(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server% %Setup (English)'").ProductName} 
Invoke-Expression $command 

問題は、スクリプトコードの最初の行に遭遇初めてです、それはそのコードを実行しようとします。スクリプトのその時点で、私は残りの変数を割り当てていません

これは、スクリプトでPSExecを実行しようとしているところで特に問題です。私は約10のコマンドを変数にラップし、後でスクリプトのさまざまな点で呼び出したいと思います。

$CreateSymbolicLink = .\PsExec\PsExec.exe \\$computer -u username -p password -accepteula -h -i 1 cmd "/c mklink /D C:\Applications \\server\Share" 

Invoke-Expression $CreateSymbolicLink 

しかし、スクリプトが最初から実行するときに変数が定義されていないとき、それは実際に私がやってからそれを避けるためにしようとしていた、PSEXECを実行します。

どうすればこの問題を解決できますか?私はSet-Variableコマンドレットを使用しようとしましたが、これもコマンドを実行しているように見えます。

+0

$コマンド= {Invoke-Command -ComputerName $ Computer-クレデンシャル$ Credential -ScriptBlock {(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server%セットアップ(英語)'))。ProductName}'および'&$ command'です。 – PetSerAl

答えて

0

このようないつものように変数を割り当てます。その後、

$a = { 
#script block code 
(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server% %Setup (English)'").ProductName 
} 

Invoke-Command -ComputerName $Computer -Credential $Credential -ScriptBlock $a 

他の方法を、されて、上記と同様の変数自体、にそれをすべてを包む:

$command = { 
Invoke-Command -ComputerName $Computer -Credential $Credential -ScriptBlock{(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server% %Setup (English)'").ProductName} 
} 

このように呼び出す:

& $command 

第1の例は、Octopus Deployのような場合に、これを複数回にわたって展開することができるさまざまな環境でより有益です。スクリプトブロックは、触手付きの複数のマシン、心に浮かぶそのような例です。

+0

これは完璧です!どうもありがとうございます! :) 私はおそらく両方のフォーマットを使用するつもりですが、PSExecの実行には、コマンド全体が1つの変数にラップされ、次にアンパサンド記号を使用して呼び出された2番目のメソッドを使用します。 –

関連する問題