Есть ли руководство по (несколько) запутанному синтаксису PowerShell? Пример с Biztalk

Вероятно, мне не следует задавать общий вопрос с конкретным примером, но мне трудно перевести некоторые основные команды из консоли 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

И все же я не понимаю, почему...


person Maxime Labelle    schedule 01.09.2009    source источник
comment
Вы уверены, что в последнем примере нет ошибки скрипта? Является ли $HostName фактической строкой (не нулевой или пустой), когда вы ее назначаете? В PowerShell не должно быть разницы между присвоением буквального строкового значения и использованием имени переменной (когда переменная имеет строковый тип).   -  person oɔɯǝɹ    schedule 02.08.2016


Ответы (2)


Что касается руководств, лучшей книгой является Windows PowerShell в действии Брюса Пайетта. В феврале выйдет второе издание, но вы можете получить ранний доступ к электронному варианту. Есть также пара бесплатных книг. Mastering PowerShell от доктора Тобиаса Вельтнера, и у меня также есть короткий ‹ 60 страниц электронная книга - Эффективная Windows PowerShell. Этот последний охватывает ряд ошибок, а также дает вам ментальную модель того, как работает PowerShell.

WRT ошибка, интересно, повезет ли вам использовать встроенную поддержку PowerShell для WMI, например:

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

Посмотрите, есть ли у результирующего объекта WMI соответствующие данные и методы (сопоставление и установка):

$host | fl *
$host | Get-Member
person Keith Hill    schedule 01.09.2009
comment
Я думаю, что Get-WmiObject предназначен только для извлечения существующих объектов. Можно ли его использовать для создания новых экземпляров классов WMI? - person Maxime Labelle; 02.09.2009

Что касается ошибки Map(), иногда с WMI вам нужно вернуться и вместо этого выполнить $objServerHost.psbase.Invoke("Map"). Кроме этого, у меня есть несколько примеров сценариев PowerShell для администрирования BizTalk, которые могут оказаться полезными. в качестве гидов.

person tomasr    schedule 01.09.2009
comment
К сожалению, в моем случае это не работает. Я получаю сообщение об ошибке Ошибка вызова метода, поскольку System.Management.Automation.PSInternalMemberSet не содержит имя метода Invoke. - person Maxime Labelle; 02.09.2009
comment
Спасибо за ссылки; Я натыкался на них изредка. - person Maxime Labelle; 02.09.2009