Вероятно, мне не следует задавать общий вопрос с конкретным примером, но мне трудно перевести некоторые основные команды из консоли PowerShell в повторно используемые функции и пользовательские командлеты. Есть ли где-нибудь подробное руководство по синтаксису PowerShell с подсказками, подсказками и советами?
Например, я пытаюсь создать функцию для автоматизации администрирования экземпляров BizTalk Host. Следующая функция не работает (сбой во время выполнения), тогда как каждая отдельная строка работает и работает должным образом при отдельной вставке в консоль 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 не должно быть разницы между присвоением буквального строкового значения и использованием имени переменной (когда переменная имеет строковый тип). - person oɔɯǝɹ   schedule 02.08.2016