2011-01-11 2 views
10

Bei der Powershell-Automatisierung habe ich Probleme mit der automatischen Erfassung von Daten, die von einer .cmd-Datei in stdout geschrieben wurden. Ich habe zwei Funktionen, die in etwa wie folgt tun:Wie kann ich verhindern, dass Daten in meinem Rückgabewert als Standard ausgegeben werden?

function a { 
    & external.cmd # prints "foo" 
    return "bar" 
} 

function b { 
    $val = a 
    echo $val # prints "foobar", rather than just "bar" 
} 

Grundsätzlich Daten, dass external.cmd zu stdout sendet, werden hinzugefügt, um den Rückgabewert von a, obwohl alles, was ich wirklich von a zurückkehren will, ist die Zeichenfolge, die ich angegeben. Wie kann ich das verhindern?

Antwort

13

Hier sind ein paar verschiedene Ansätze für den Umgang mit dieser:

  • Erfassung der Ausgang des .cmd-Skript:

    $output = & external.cmd # saves foo to $output so it isn't returned from the function 
    
  • die Ausgabe auf null umleiten (werfen Sie es weg)

    & external.cmd | Out-Null # throws stdout away 
    
  • umleiten es in eine Datei

    & external.cmd | Out-File filename.txt 
    
  • ignoriert es in dem Anrufer, indem sie es in der Anordnung von Objekten Skipping, die von der Funktion

    $val = a 
    echo $val[1] #prints second object returned from function a (foo is object 1... $val[0]) 
    

In Powershell jeder Ausgabewert des Code nicht erfassen zurückgegeben zurückgegeben der Aufrufer (einschließlich stdout, stderr, etc). Sie müssen also ein Objekt erfassen oder an etwas übergeben, das keinen Wert zurückgibt, oder Sie erhalten ein Objekt [] als Rückgabewert der Funktion.

Das Schlüsselwort return dient nur der Klarheit und dem sofortigen Beenden eines Skriptblocks in PowerShell. So etwas wie dies würde auch funktionieren (nicht wörtlich, sondern nur Sie auf die Idee geben):

function foo() 
{ 
    "a" 
    "b" 
    "c" 
} 

PS> $bar = foo 
PS> $bar.gettype() 
System.Object[] 
PS> $bar 
a 
b 
c 

function foobar() 
{ 
    "a" 
    return "b" 
    "c" 
} 

PS> $myVar = foobar 
PS> $myVar 
a 
b 
4

ich generell lieber eine der beiden folgenden Techniken verwenden, die, meiner Meinung nach, stellen Sie den Code besser lesbar:

  • Guss ein Ausdruck, um den Rückgabewert ungültig zu unterdrücken:

    [void] (expression)

  • Weisen die Ausgabe valu e auf das $ null Variable:

    $null = expression

Zum Beispiel:

function foo 
{ 
    # do some work 
    return "success" 
} 

function bar 
{ 
    [void] (foo) # no output 
    $null = foo # no output 
    return "bar" 
} 

bar # outputs bar 
2

Wenn Sie die Ausgabe des Befehls wollen eine noch drucken, um die Powershell-Befehlszeile, die Sie tun können Variante der angenommenen Antwort:

& external.cmd | Out-Host