2011-01-11 52 views
10

在做一些Powershell自動化時,我遇到了一個由.cmd文件寫入標準輸出的數據被自動捕獲的方法。我有兩個函數,這樣做如下:如何避免將數據打印到我的返回值中的stdout?

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

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

基本上,external.cmd發送到標準輸出的數據被添加到a的返回值,即使我真正想從a返回的字符串,我指定。我怎樣才能防止這一點?

回答

13

這是如何處理這幾個不同的方法:

  • 捕捉.CMD腳本的輸出:

    $output = & external.cmd # saves foo to $output so it isn't returned from the function 
    
  • 輸出重定向到空(扔掉)

    & external.cmd | Out-Null # throws stdout away 
    
  • 將其重定向到一個文件

    & external.cmd | Out-File filename.txt 
    
  • 通過對象的數組這是一個從功能

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

在PowerShell中,返回代碼不捕獲任何產值返回在跳過它忽略它的調用者調用者(包括stdout,stderr等)。所以你必須捕獲或管道它不返回值的東西,否則你最終會得到一個對象[]作爲函數的返回值。

return關鍵字實際上只是爲了清晰並立即退出PowerShell中的腳本塊。像這樣的東西,甚至將工作(不逐字但只給你的想​​法):

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

我一般喜歡使用以下兩種技術,這在我看來,使代碼更易讀之一:

[void] (expression)

  • 分配輸出VALU:

    • 角色的表達式中,爲了抑制返回值無效e將$空變量:

      $null = expression

    例如:

    function foo 
    { 
        # do some work 
        return "success" 
    } 
    
    function bar 
    { 
        [void] (foo) # no output 
        $null = foo # no output 
        return "bar" 
    } 
    
    bar # outputs bar 
    
  • 2

    如果你想從該命令的輸出仍然打印到PowerShell命令行,你可以做一個接受答案的變種:

    & external.cmd | Out-Host