2009-09-01 59 views
2

我可能不應該問一個具體示例的通用問題,但我很難將一些基本命令從PowerShell控制檯轉換爲可重用函數和自定義cmdlet。有什麼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) 
} 

順便說一句,我收到在這種特殊情況下的錯誤,這是一個:

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'是一個實際的字符串(非空或空),當你分配它?在PowerShell中,分配文字字符串值或使用變量名稱(當變量是字符串類型時)應該沒有區別。 – 2016-08-02 09:33:07

回答

6

至於導遊走,那裏最好的書是Bruce Payette的Windows PowerShell in Action。第二版將於二月份到期,但您可以儘早獲得電子草稿。那裏還有幾本免費書籍。 Mastering PowerShell博士托比亞斯Weltner和我也有一個短的< 60頁電子書 - Effective Windows PowerShell。最後一篇介紹了一些陷阱,併爲您提供PowerShell工作原理的心理模型。

WRT的錯誤,我不知道你會用更好的運氣PowerShell中的內置支持WMI如:

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

看看所產生的WMI對象具有適當的數據&方法(地圖&安裝) :

$host | fl * 
$host | Get-Member 
+0

+1免費下載電子書。 – 2009-09-01 15:42:43

+0

我認爲Get-WmiObject只能檢索現有的對象。它可以用來創建WMI類的新實例嗎? – 2009-09-02 07:41:25

0

關於地圖()的錯誤,有時WMI需要回落,而是做$ objServerHost.psbase.Invoke( 「地圖」)。除此之外,我有一個用於BizTalk管理的few sample PowerShell scripts,您可能會發現它們可以用作指南。

+0

不幸的是,這不適用於我的情況。我得到一個錯誤「方法調用失敗,因爲System.Management.Automation.PSInternalMemberSet不包含方法名'Invoke'」。 – 2009-09-02 07:42:52

+0

感謝您的鏈接;偶然偶然偶然發現了他們。 – 2009-09-02 07:43:39

相關問題