2017-10-07 2 views
0

J'ai des problèmes pour passer un tableau au script PowerShell en tant que paramètre de CMD. Voici un exemple du code PS:Passer un tableau en tant que paramètre de CMD à PowerShell pose des problèmes

[CmdletBinding()] 
Param(
    [string[]]$serverArray, 
) 

$serviceName = 'service1' 

function getState { 
    Process { 
     $serverArray 
     foreach ($server in $serverArray) { 
      $servState = (Get-WmiObject Win32_Service -ComputerName $server -Filter "name='$serviceName'").State 
     } 
    } 

getState 

Comment j'appelle script CMD:

powershell -file .\script.ps1 -serverArray Server1,Server2 

Je reçois une erreur, car $serverArray n'est pas passé un tableau:

 
Server1,Server2 
Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 
0x800706BA) 
At C:\script.ps1:58 char:29 
+    $servState = (Get-WmiObject <<<< Win32_Service -ComputerName $server -Filter "name='$serviceName'").State 
    + CategoryInfo   : InvalidOperation: (:) [Get-WmiObject], COMException 
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand 

Si Je cours la même commande à partir d'une fenêtre PowerShell cela fonctionne parce que le script accepte $serverArray comme un tableau:

.\script.ps1 -serverArray Server1,Server2 
 
Server1 
Server2 
+0

'-file' ->' -command' – PetSerAl

+0

S'il vous plaît assurez-vous de test exécuter votre code [mcve] pour vous assurer qu'il doe sn't introduire des erreurs supplémentaires comme la virgule de fin parasite dans votre définition de paramètre et le crochet de fermeture manquant de votre fonction. –

Répondre

0

Vous pouvez exécuter ce à partir de l'invite de commande: powershell script.ps1 "Server1,Server2"

Et si vous ajoutez d'autres paramètres à votre script:

powershell script.ps1 "Server1,Server2" "parameter2 argument" "parameter3 argument"

+0

Que diriez-vous de 'powershell -NoProfile -File. \ Script.ps1 ...' – lit

0

CMD ne sait rien sur les tableaux PowerShell . Vous pouvez transmettre la liste des serveurs comme des jetons individuels

powershell -File .\script.ps1 Server1 Server2 

et utiliser le automatic variable$args au lieu d'un paramètre nommé dans votre script:

foreach ($server in $args) { 
    ... 
} 

ou vous pouvez split la valeur du paramètre à des virgules dans la corps:

[CmdletBinding()] 
Param(
    [string]$Servers 
) 

$serverArray = $Servers -split ','