2

いくつかのことを自動化するために使用したいと思っているラッパーPowerShellスクリプトがあります。これは非常に基本的なものであり、スクリプト内の行であるかのようにスクリプトを実行するパラメーターを受け入れます。私は絶対にそれを動作させることができません。

例:

param( [string[]] $p)
echo $p
# Adds the base cmdlets
Add-PSSnapin VMware.VimAutomation.Core
# Add the following if you want to do things with Update Manager
Add-PSSnapin VMware.VumAutomation
# This script adds some helper functions and sets the appearance. You can pick and choose parts of this file for a fully custom appearance.
. "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-VIToolkitEnvironment.ps1"

$p

上記の例では、$pをスクリプトの行であるかのように実行します。私はこれが安全ではないことを知っています、そしてそれはおそらく問題があるところです。

スクリプトを実行して$pのパラメーターを渡す方法は次のとおりです。

D:\ps\test>powershell -command "D:\ps\test\powershell_wrapper.ps1" 'Suspend-VM servername -Verbose -Confirm:$False'

'Suspend-VM servername -Verbose -Confirm:$ False'のパラメーターをスクリプト内で実行するにはどうすればよいですか?値をパラメーターとして渡すのではなく、スクリプトに値を含めるだけで、問題なく実行されます...

4

1 に答える 1

3

基本的に、ニーズが実際に何であるか、およびコードをどのように構造化するかに応じて、この2つの方法にアプローチできます。

アプローチ#1-呼び出し-表現

Invoke-Expression基本的に、文字列を式のように扱い、評価することができます。次の簡単な例を考えてみましょう。

Invoke-Expression '{"Hello World"}'

これにより、文字列が直接入力された式であるかのように評価され、文字列「HelloWorld」がパイプラインに配置されます。これを使用して、文字列パラメータを取得し、スクリプトでその場で実行できます。

アプローチ#2-ScriptBlockの使用

PowerShellには、ScriptBlockと呼ばれる特別なデータ型があり、スクリプトを変数にバインドして、そのスクリプトをコードの一部として呼び出すことができます。繰り返しますが、ここに簡単な例があります。

function Test-SB([ScriptBlock]$sb) {
  $sb.Invoke()
}

Test-SB -sb {"Hello World"}

この例では、ScriptBlockタイプの単一パラメーター$sbを使用して関数を作成します。パラメータが実際のコードチャンクにバインドされていることに注意してください{"Hello World"}。そのコードは$sbパラメーターに割り当てられ、.Invokeメソッドを呼び出すと実際にコードが実行されます。ScriptBlockを取り込んで、スクリプトの一部として呼び出すようにコードを適合させることができます。

アプローチ#3-プロファイルの更新

OK、それで私はそれにアプローチする2つの方法があると言いました。実際には3番目の...種類があります...VMWareコマンドレットをに追加して$profile、それらが常に存在し、それらのライブラリにロードするためにラッパーを必要としないようにすることができます。確かに、これはかなり大きなハンマーですが、これが常に作業している環境であれば意味があるかもしれません。起動時に.ps1を実行するPowerShellへのショートカットを作成して、これらのライブラリを含めてぶらぶらすることもできます(これはMSがSharePoint管理シェルや他のいくつかで行ったことです)。このTechNetページを見て、$ profileの詳細と、それが役立つかどうかを確認してください。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb613488.aspx

于 2012-07-19T23:27:49.660 に答える