2009-09-01 9 views
2

具体的な例では一般的な質問はしませんが、PowerShellコンソールの基本コマンドを再利用可能な関数とカスタムコマンドレットに変換するのは苦労します。 PowerShellの構文には、ちょっとしたヒント、ヒント、ヒントなどが書いてあります。(幾分)複雑なPowerShell構文のガイドがありますか?例Biztalk

たとえば、私はBizTalkホストインスタンスの管理を自動化するために関数を作成しようとしています。次の関数は動作しません(実行時に失敗します)。一方、PowerShellコンソールに個別に貼り付けられたときには、それぞれの行が動作し、期待どおりに動作します。ところで

function AddNewHostInstance([string]$ServerName, [string]$HostName, [string]$Login, [string]$Password) 
{ 
    [System.Management.ManagementObject]$objServerHost = ` 
     ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_ServerHost").CreateInstance() 

    $objServerHost["ServerName"] = $ServerName 
    $objServerHost["HostName"] = $HostName 
    $objServerHost.Map() 

    $name = "Microsoft BizTalk Server " + $HostName + " " + $ServerName 

    [System.Management.ManagementObject]$objServerHost = ` 
     ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostInstance").CreateInstance() 

    $objHostInstance["Name"] = $name 
    $objHostInstance.Install($Login, $Password, $True) 
} 

、私はこの特定のケースでは、受信エラーはこの1つである:

PS C:\Users\username> createHostInstances $server, $host, $user, $pwd 
Exception calling "Map" : "Invalid parameter " 
At line:14 char:39 
+  $objServerHost.Map <<<<() 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : WMIMethodException 
Exception calling "Install" : "Instance of the WMI class is not found. 
No instance was found with the specified key. This could be the result of the instance being deleted by another BizTalk Admin session." 
At line:19 char:29 
+  $objHostInstance.Install <<<< ($Login, $Password, $True) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : WMIMethodException 
PS C:\Users\username> 

[編集]さらなる調査の後、その機能は、WMIオブジェクトにプロパティを割り当てること好きではないと思われます変数を介して提供された関数パラメータに頼るのではなく、すべての値をハードコードすると、期待通りに機能します!

基本的に、この作品:この一方

# Using hard-coded value 
$objServerHost["HostName"] = "TestHost" 

をしません:

# Using function supplied parameter 
$objServerHost["HostName"] = $HostName 

それでも、私は限りガイドが行くように、なぜ...

+0

最後の例でスクリプトエラーが発生していませんか? '$ HostName'は、あなたがそれを割り当てるとき、実際の文字列(nullでも空でもない)ですか? PowerShellでは、リテラル文字列値の割り当てと変数名(変数が文字列型の場合)の間には違いはありません。 –

答えて

6

を理解していません、 Bruce PayetteのベストブックはWindows PowerShell in Actionです。 2月に予定されている第2版がありますが、電子ドラフトに早期にアクセスできます。そこにもいくつかの無料の本があります。 Dr. Tobias WeltnerのMastering PowerShellと私はまた、< 60ページ電子ブック - Effective Windows PowerShellを持っています。この最後の1つは、PowerShellの仕組みの精神モデルを提供するだけでなく、いくつかの問題をカバーしています。あなたはPowerShellの組み込みのWMIなどのサポートを使用して、より良い運を持っているかどう

WRTエラーが、私は疑問に思う:

$namespace = 'root/MicrosoftBizTalkServer' 
$host = Get-WmiObject -namespace $namespace -class MSBTS_HostInstance 

結果のWMIオブジェクトは、適切なデータ&方法(地図&インストール)を持っているかどうかを確認します:

マップ()のエラーについて
$host | fl * 
$host | Get-Member 
+0

+1は無料でダウンロード可能な電子書籍です。 –

+0

私はGet-WmiObjectは既存のオブジェクトを取り出すためだけだと思います。 WMIクラスの新しいインスタンスを作成するために使用できますか? –

0

、時々、WMIを使用すると、バックドロップ、代わりに$ objServerHost.psbase.Invoke( "マップ")を実行する必要があります。それ以外にも、BizTalk管理用にfew sample PowerShell scriptsが用意されています。ガイドとして役立つかもしれません。

+0

残念ながら、これは私の場合は機能しません。 "System.Management.Automation.PSInternalMemberSetにメソッド名 'Invoke'が含まれていないため、メソッドの呼び出しに失敗しました。 –

+0

リンクありがとうございました。私は彼らを横断して時折会った。 –

関連する問題