Powershell:写入输出-NoEnumerate不抑制输出到控制台

时间:2015-10-01 20:50:32

标签: powershell powershell-v4.0

我正在PowerShell中编写一个函数,我希望通过其他PowerShell函数调用该函数,并将其用作独立函数。 考虑到这一目标,我想使用Write-Output向管道发送消息到这些其他功能。 但是,我不希望Write-Output写入PowerShell控制台。 TechNet page for Write-Output州:

  

写输出:

     
    

将指定的对象发送到管道中的下一个命令。如果该命令是管道中的最后一个命令,则对象将显示在控制台中。

         
      

-NoEnumerate:

             
        

默认情况下,Write-Output cmdlet始终枚举其输出。 NoEnumerate参数禁止默认行为,并阻止Write-Output枚举输出。 NoEnumerate参数对通过括号括起命令而创建的集合没有影响,因为括号强制枚举。

      
    
  

出于某种原因,这个-NoEnumerate开关在PowerShell ISE或PowerShell CLI中对我不起作用。我总是输出到我的屏幕。

$data = "Text to suppress"
Write-Output -InputObject $data -NoEnumerate

这将始终返回'Text to suppress'(无引号)。

我见过有人建议像这样管道Out-Null

$data = "Text to suppress"
Write-Output -InputObject $data -NoEnumerate | Out-Null
$_

这会抑制屏幕输出,但是当我使用$_之后,我的管道中没有任何内容,这首先使我无法使用写输出。

系统是使用PowerShell 4.0的Windows 2012

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

写入输出不会写入控制台,除非它是管道中的最后一个命令。在第一个示例中,Write-Output是管道中唯一的命令,因此其输出将被转储到控制台。为了防止这种情况发生,您需要将输出发送到某处。例如:

Write-Output 5

将向控制台发送“5”,因为Write-Output是管道中的最后一个也是唯一的命令。但是:

Write-Output 5 | Start-Sleep

不再这样做,因为Start-Sleep现在是管道中的下一个命令,因此成为Write-Output数据的接收者。

答案 1 :(得分:0)

试试这个:

编写函数,因为您已将Write-Output写为管道中的最后一个命令。这应该将输出向上发送到函数的调用者。在这里,调用者可以使用输出,同时抑制写入控制台。

  MyFunction blah, blah, blah | % {do something with each object in the output}

我还没试过这个,所以我不知道它是否有效。但似乎有道理。

答案 2 :(得分:0)

我的问题不是最好的。

首先6不会抑制 i=43 while tree.xpath('/html/body/form/table[3]/tr/td/table[5]/tr/td/table[1]/tr/td[2]//p['+str(i)+']/a/text()')!=[] : reference=tree.xpath('/html/body/form/table[3]/tr/td/table[5]/tr/td/table[1]/tr/td[2]//p['+str(i)+']/text()') link_ref=tree.xpath('/html/body/form/table[3]/tr/td/table[5]/tr/td/table[1]/tr/td[2]//p['+str(i)+']//a/text()') testo_reference=testo_reference + link_ref[0]+reference i= i+1 上的输出。

其次,Write-Output -NoEnumerate应该写出它的输出。试图让它停下来是一个愚蠢的目标。

第三,管道Write-OutputWrite-OutputWrite-Output意味着您提供的值Out-Null不会继续沿着管道继续下去,这是我使用它的唯一原因。

第四,Out-File也没有将值传递给管道。

所以我回答了我的问题,意识到它是否打印到屏幕上并不是一件可怕的事情并且继续前进。感谢您的帮助和建议。

答案 3 :(得分:0)

将输出显式存储在变量中比尝试使用隐式自动变量更为谨慎。一旦运行另一个命令,该隐式变量将丢失存储在其中的先前输出。没有自动变量来做您要求的事情。

如果你想输入一组命令而不将所有命令都存储在临时变量中,你也可以在命令行编写一个scriptblock,并使用你已经表明过的$ _自动变量重新尝试使用。

您只需要使用shift + enter开始一个新行,并像在普通的scriptblock中一样编写代码块 - 您可以在其中使用$ _自动变量作为管道的一部分。