我可能不應該問一個具體示例的通用問題,但我很難將一些基本命令從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
不過,我不明白爲什麼...
你確定在最後一個例子中沒有腳本錯誤嗎? '$ HostName'是一個實際的字符串(非空或空),當你分配它?在PowerShell中,分配文字字符串值或使用變量名稱(當變量是字符串類型時)應該沒有區別。 – 2016-08-02 09:33:07