我正在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
感谢任何帮助。
答案 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-Output
到Write-Output
或Write-Output
意味着您提供的值Out-Null
不会继续沿着管道继续下去,这是我使用它的唯一原因。
第四,Out-File
也没有将值传递给管道。
所以我回答了我的问题,意识到它是否打印到屏幕上并不是一件可怕的事情并且继续前进。感谢您的帮助和建议。
答案 3 :(得分:0)
将输出显式存储在变量中比尝试使用隐式自动变量更为谨慎。一旦运行另一个命令,该隐式变量将丢失存储在其中的先前输出。没有自动变量来做您要求的事情。
如果你想输入一组命令而不将所有命令都存储在临时变量中,你也可以在命令行编写一个scriptblock,并使用你已经表明过的$ _自动变量重新尝试使用。
您只需要使用shift + enter
开始一个新行,并像在普通的scriptblock中一样编写代码块 - 您可以在其中使用$ _自动变量作为管道的一部分。