有时,答案是“不”。事实证明这不是一个问题,而是更多的 cri de coeur (好的,只是抱怨)。
Team Foundation Server 2010 PowerShell管理单元导出名为Get-TfsPendingChange
的cmdlet,它可以执行听起来像这样的操作。
如果没有挂起的更改,Get-TfsPendingChange
回应“没有待处理的更改。”在标准输出上。我从来没有问过它。以下抑制输出的尝试都失败了:
$pcs = $(Get-TfsPendingChange -Server $server "$/foo/bar" -User $env:USERNAME -r ) | out-null;
$($pcs = Get-TfsPendingChange -Server $server "$/foo/bar" -User $env:USERNAME -r ) | out-null;
$pcs = Get-TfsPendingChange -Server $server "$/foo/bar" -User $env:USERNAME -r | out-null;
我没有收到错误,但文本输出没有重定向。重定向的是cmdlet的正常成功输出,如果有待返回的挂起更改。您可以抑制的ONLY输出是有用的输出。如果没有挂起的更改,则会通过stdout
获取文本垃圾。如果有任何实际挂起的更改,那么(对象,而不是文本)流可以重定向到空设备,但这比无用更糟糕。
因此,stdout上的文本似乎是来自此cmdlet的副作用,而不是cmdlet的输出,并且无法在PowerShell中重定向。 PowerShell重定向运算符>
和|
没有fileno说明符(PS2中为2,2, 3, 4, 5, and * in PS3/PS4),处理对象流,即不是stdout
。如果stdout
被这个新的对象流概念所取代(或者如果TFS团队中的某些天才没有确定cmdlet应该在所有方向上随机发出文本噪声作为副作用),那就没问题了。
垃圾输出绝对是stdout
,而不是stderr
。当我从nul
运行时,我可以将整个脚本的标准输出重定向到cmd.exe
,并且按预期工作,因为duh:
c:\>powershell .\tfstest.ps1 > nul
但是,我不想压缩整个脚本的所有输出。只是一个snapin cmdlet的输出。这不是世界末日,但是随机的东西,我称之为回声垃圾,我无法控制,这令人恼火。否则该脚本可以正常工作(请参阅更新)。
一种解决方法是在stdout
上使用一些任意字符串(比如"KLUDGEPREFIX"
)为我想要回显的所有内容添加前缀,并从批处理文件中运行整个混乱,该文件将PowerShell脚本的输出通过{ {1}}然后通过PowerShell片段剥离每行的前缀。
相反,我将围绕问题编写其余的脚本,所以看起来他们得到的是我的意图,因为,事实上,我要告诉他们他们没有任何待定的更改无论如何。然而,这是一个有价值的练习,就是让我的头脑进入PowerShell。
更新:这个脚本变得脆弱,不可靠,冰冷,并且无法在任何计算机上运行,而是我最初编写它的那台计算机。
我用Perl脚本替换它,花了1/10的时间来编写,执行速度快10倍,并且在没有任何愚蠢的情况下更好地完成相同的任务。 PS和TFS PS管理单元是很好的想法,但在它们准备发布之前它们都需要大量的工作。
答案 0 :(得分:1)
我不熟悉Team Foundation Server,但很可能cmdlet写入主机而不是其中一个输出流。无法在PowerShell中重定向到主机的输出,但如果在CMD中运行PowerShell脚本,主机输出将转到STDOUT(成功输出流也是如此),并且可以在那里重定向。
演示:
PS C:\> cat .\test.ps1
Write-Host 'foo'
PS C:\> .\test.ps1 | Out-Null
foo
PS C:\> .\test.ps1 >$null
foo
PS C:\> & cmd.exe /c powershell.exe -File .\test.ps1
foo
PS C:\> & cmd.exe /c powershell.exe -File .\test.ps1 `>nul
PS C:\> & cmd.exe /c powershell.exe -File .\test.ps1 >$null
PS C:\> _
答案 1 :(得分:-1)
如果你在>前加2它只会重定向错误。同样,1表示非错误(stdout)。因此,如果你想要所有的stdout,而不是stderr,你可以输入
$pcs = Get-TfsPendingChange -Server $server "$/foo/bar" -User $env:USERNAME -r 1> $null
$ null可以用作/ dev / null的等效项。你的代码可能会在磁盘上创建文件“nul”。