2009-09-01 5 views
2

Je ne devrais probablement pas poser une question générique avec un exemple spécifique, mais j'ai du mal à traduire certaines commandes de base de la console PowerShell vers des fonctions réutilisables et des cmdlets personnalisées. Existe-t-il un guide définitif de la syntaxe de PowerShell quelque part, avec des astuces, des conseils et des astuces? Par exemple, j'essaie de créer une fonction afin d'automatiser l'administration des instances de l'hôte BizTalk. La fonction suivante ne fonctionne pas (échoue au moment de l'exécution) alors que chaque ligne individuelle fonctionne et fonctionne comme prévu lorsqu'elle est collée individuellement dans une console PowerShell.Existe-t-il un guide pour la syntaxe PowerShell (quelque peu) compliquée? Exemple avec Biztalk

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) 
} 

Par ailleurs, l'erreur je reçois dans ce cas particulier est celui-ci:

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> 

[Modifier] Après plus ample investigation, il semble que la fonction ne veut pas attribuer des propriétés d'objet WMI via une variable. Si je code dur toutes les valeurs (au lieu de me fier aux paramètres de la fonction fournie), cela fonctionne comme prévu!

En gros, cela fonctionne:

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

Alors que cela ne fait pas:

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

encore, je ne comprends pas pourquoi ...

+0

Etes-vous sûr qu'il n'y a pas d'erreur de script dans le dernier exemple? Est-ce que '$ HostName' est une chaîne réelle (non nulle ou vide) lorsque vous l'affectez? Dans PowerShell, il ne devrait pas y avoir de différence entre l'attribution d'une valeur de chaîne littérale ou l'utilisation d'un nom de variable (lorsque la variable est un type de chaîne). –

Répondre

6

En ce qui concerne les guides aller, le meilleur livre est là Windows PowerShell in Action par Bruce Payette. Il y a une deuxième édition prévue pour février, mais vous pouvez avoir un accès anticipé au brouillon électronique. Il y a aussi quelques livres gratuits là-bas. Mastering PowerShell par le Dr Tobias Weltner et moi avons aussi un court eBook de < 60 pages - Effective Windows PowerShell. Ce dernier couvre un certain nombre de pièges ainsi que vous fournir un modèle mental pour le fonctionnement de PowerShell.

WRT l'erreur, je me demande si vous auriez plus de chance à l'aide prise en charge intégrée de PowerShell pour WMI par exemple:

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

Voir si l'objet WMI résultant a les données appropriées & méthodes (Carte & Installer) :

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

+1 pour un livre électronique téléchargeable gratuitement. –

+0

Je pense que Get-WmiObject est seulement pour récupérer des objets existants. Peut-il être utilisé pour créer de nouvelles instances de classes WMI? –

0

en ce qui concerne l'erreur Carte(), parfois avec WMI, vous devez déposer en arrière et faire place objServerHost.psbase.Invoke $ ("Carte"). Autre que cela, j'ai un few sample PowerShell scripts pour l'administration de BizTalk que vous pourriez trouver utile comme guides.

+0

Malheureusement, cela ne fonctionne pas dans mon cas. J'obtiens une erreur "L'invocation de méthode a échoué car System.Management.Automation.PSInternalMemberSet ne contient pas un nom de méthode" Invoke "". –

+0

Merci pour les liens; Je suis tombé sur eux occasionnellement. –