Powershell:捕获组合输出,仅输出错误,将组合输出发送到控制台

时间:2012-09-17 13:15:47

标签: powershell io-redirection tee

我正在创建一个Powershell脚本来运行一堆scala脚本(我有理由不使用构建工具)。我想以这种方式为所有这些编译生成输出:

  1. 只是文件中的编译错误
  2. 第二个文件中合并的编译错误和标准输出
  3. 标准输出和编译错误也转到标准输出
  4. 我尝试过 tee 2>> ,甚至在 -OutVariable -ErrorVariable (后两个似乎只适用于本机Powershell命令?)。我怀疑 tee 并且重定向是某种组合中的正确方法,但经过大量搜索后,我似乎找不到合适的论坛。

    这是我当前的主循环,它只重定向错误:

    foreach($script in $scripts) {
        Write-Host scala $script
        scala -nocompdaemon $script 2>> _testerrors.txt
    }
    

    第一行是观察过程的人可以看到发生的事情(看起来正确的发球/重定向/等等会消除这种情况,作为副作用)。

    感谢任何帮助/指针;我只是Powershell的临时用户。

    更新

    更多的狩猎产生了以下因素:

    foreach($script in $scripts) {
        Write-Host scala $script
        Write-Output "> scala $script" | Out-File ./_testoutput.txt -append
        scala -nocompdaemon $script 2>&1 | tee -Variable testout
        out-file ./_testoutput.txt -InputObject $testout -append
        Write-Output "--------------------" | Out-File ./_testoutput.txt -append
    }
    

    事实证明 tee 命令可以将文本发送到文件,但由于某些奇怪的原因,它无法追加到文件。因此,您必须捕获变量中的输出,然后将变量附加到文件中。

    虽然这个结果确实解决了我的一些问题,但它仍然不会生成包含错误消息的文件。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

$Error.Clear()
scala -nocompdaemon $script 2>&1 | Tee -FilePath output.txt -Append
$Error >> errors.txt

如果您首先清除全局$Error集合,那么当您执行循环时,它应该只包含scala命令生成的错误。

答案 1 :(得分:0)

可能是你想要的,试试Start / Stop-Transcript http://technet.microsoft.com/en-us/magazine/ff687007.aspx 但请注意,某些本机可执行文件存在问题,这是一个解决方法: http://blogs.msdn.com/b/powershell/archive/2010/01/04/workaround-for-start-transcript-on-native-processes.aspx