PowerShell和Tee


9

我使用此命令在控制台和文件中查看输出:

powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc

它的效果不如我预期,我有一些疑问:

  1. 如何将stderr也重定向到文件?
  2. 输出结果很奇怪。对于某些命令,在打印文本和更新控制台/文件之间会有很大的延迟。对于其他一些命令,在打印文本时输出似乎已更新(我不带tee运行命令,并且知道应该打印什么)。这种延迟使该T恤几乎毫无用处-如果将打印一些严重错误,该怎么办,所以我需要停止该命令,但是直到为时已晚,我什么都看不到?

    对于某些命令,仅在完成完整命令后才输出输出。

  3. 此外,即使命令要求用户输入,控制台/文件输出也为空!对于该命令,我知道它的期望,并盲目打印所需的文本,并且可以正常工作,但是对于其他命令-没有输出,我将无限期地等待某件事发生,同时该命令将等待我的输入!

这些问题有解决方案吗?如果没有,那么PowerShell中的T恤是完全没有用的。


我不敢相信,成千上万个脚本中使用的工具只是因为它可能无法满足您的特定要求而“完全无用”。
斯蒂芬·詹宁斯

是的,我的意思是在这种特殊情况下它是没有用的:)我最好不要开球,否则会有这么糟糕的问题。
种族2011年

Answers:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'。见Get-Help about_Redirection
  2. 您应该捕获错误,而不要依赖Ctrl+ C。见Get-Help about_Try_Catch_Finally。您正在运行的命令是外部程序还是脚本?
  3. 据我了解,通常直到到达行尾字符之前,字符串对象才在管道中向下发送。原因很简单:如果不这样做,则部分(读取:不完整)字符串将沿管道下降。 Tee也许可以很好地处理部分字符串,但是其他cmdlet则可以,ForEach-Object或者Select-Object肯定不会。请注意,它Get-Content具有一个特殊的开关-ReadCount,该开关在某种程度上可以覆盖此行为,并且它将严重干扰Select-Object -Skip/-First/-Last/-Unique管道下方的命令。

很有可能您正在运行的外部程序不会遵守PowerShell期望的约定。Tee,例如,正确地称为Tee-Object,它应该告诉您它擅长处理的各种事情。在这种情况下,您可能会更进一步地tee.exe从旨在立即转发内容的GNU Win32 UtilsMSYS中获取信息。


1.谢谢;2.正确,我的意思是一些不可预见的紧急情况;3.我不明白什么是不完整的字符串:)最终我的命令运行Python脚本-它是结构命令。我尝试使用为Windows编译的linux utils中的tee.exe-相同的结果,在某些情况下没有输出。这是否意味着我的具体配置和具体脚本根本无法与tee实用程序一起正常工作?谢谢。
race1 2011年

在我看来,这听起来像是python脚本行为异常。
培根片
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.