2016-06-23 10 views
-1

Ich schreibe einfach ein paar grundlegende Skripte, nachdem ich PowerShell zu lange ausgelassen habe, und ich stehe hier irgendwie fest. Der Versuch, mehrere Parameter zu einem einzigen „Argument“ in einer Funktion, aber es wird immer nur geben den ersten Wert in der Zeichenfolge

#-------------------------------- 
# Returns logged on user of machine(s) given in parameter 
#-------------------------------- 
function Get-UserLogged{ 
    param($computerName) 
    foreach ($computer in $computerName) { 

     return (query user /server:$computerName) 
    } 
} 

Nun, wenn ich die Funktion aufrufen und führen zum Beispiel ...

Get-UserLogged Server01 Server02 Server03 
passieren

es wird nur das Rück den Ausgangs für Server 1, so scheint es, dass der foreach funktioniert nicht wie erwartet

Verschiedene Skript gleiches Problem:

function p{ 
    param($computerName) 

    foreach ($computer in $computerName) { 

     return (test-connection $computer -Count 1) 

    } 

} 

wenn ich laufen:

p localhost, google.com, bbc.com 

es versucht, nur localhost

+0

Welche sind diese? Server01 Server02 Server03 –

+0

Was auch immer der Standardwert ist, habe ich versucht, den Parameter als eine Zeichenfolge und ein Array, aber das gleiche Ergebnis – craigread7

+1

Sie sollten die return-Anweisung nicht verwenden. Mit Return wird PowerShell angewiesen, die aktuelle Funktion/das aktuelle Skript zu beenden. Wenn Sie stattdessen mehrere Werte zurückgeben möchten, rufen Sie einfach den Befehl auf, der diese Werte generiert (z. B. entfernen Sie in den obigen Beispielen die return-Anweisung und die runden Klammern). In Ihrem ersten Beispiel verwendet der Befehl in Ihrer foreach-Anweisung außerdem $ computerName (die Sammlung, die übergeben wird) und nicht nur $ computer (das Element, das Sie gerade in der aktuellen Iteration der foreach-Schleife verarbeiten). Ändere diese zwei Dinge und du solltest in viel besserer Form sein. –

Antwort

3

Sie Referenzierung der Array $computerName innerhalb der Schleife, nicht den "aktuellen Artikel", $computer.

function Get-UserLogged{ 
    param($computerName) 
    foreach ($computer in $computerName) { 

     query user /server:$computer 
    } 
} 

Um ein Array von Strings auf einen Parameter übergeben, verwenden Sie ein Komma um die Elemente zu trennen:

Get-UserLogged -computerName Server01, Server02, Server03 
+0

Vielen Dank, so ist der Parameter ein Array als Standard oder ist es ein Array gemacht, wenn mehr als nur Zeichenfolge ohne Leerzeichen?Ich hatte den Eindruck, dass es sich um einen String und ein Array handelt, wenn Sie ihm ein Präfix mit einem @ – craigread7

+0

vorangestellt haben. Es wurde ein Array durch das Komma gemacht. Sie haben keinen Typ für den Parameter im 'param()' - Abschnitt angegeben. Wenn es also ein einzelnes Wort ist (oder in Anführungszeichen gesetzt wird, wenn Sie im Wert ein Leerzeichen haben), wird es von der Powershell zu einer Zeichenfolge. Wenn du '-computerName 1 'benutzt hast, wäre es ein' int'. –

+0

Eigentlich immer noch das gleiche Problem nach dem Verweis auf das aktuelle Element anstelle des Arrays. Get-UserLogged kann nicht getestet werden, da ich keine Server zu Hause habe, aber ich habe es mit einem anderen Skript versucht: (Eingefügter Code in Originalpost als nicht sicher über Kommentarformatierung) – craigread7

Verwandte Themen