我目前正在使用wintee来记录测试脚本的结果消息。这是命令的样子:
test_name.bat [parameters] 2>&1 | wtee log.txt
但是,我只想将STDERR归档到一个文件,同时仍然向控制台显示STDOUT和STDERR。问题出现在wintee的限制中:它似乎只分叉STDIN,STDOUT和输入文件。
这是我正在尝试做的事情:
这样,控制台仍会显示两个流的消息,而wintee只会从(最初的)STDERR中分叉消息。
但是,我不确定是否可能,因为我对流重定向的理解很浅。我试图看看我是否可以使用另一个流将STDOUT重定向到STDERR:
echo Hello World! 3>&2 >3
但是,它没有打印任何东西。
我是否正在尝试以原生批次完成(可选择使用其他工具的帮助)?如果是这样,我做错了什么?
答案 0 :(得分:2)
Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
On Error Resume Next
Set Fso = CreateObject("Scripting.FileSystemObject")
Set File = Fso.CreateTextFile(Arg(0), True)
If err.number <> 0 then
Outp.WriteLine "Error: " & err.number & " " & err.description & " from " & err.source
err.clear
wscript.exit
End If
Do Until Inp.AtEndOfStream
Line=Inp.readline
outp.writeline Line
File.WriteLine Line
Loop
这个Tees StdOut。将第4行更改为Set Outp = Wscript.Stderr
将使其成为Tee StdErr。
使用dir | cscript //nologo Tee.vbs
。
答案 1 :(得分:0)
我不知道wintee
命令,但我想我可以帮你解决重定向问题:
而不是test_name.bat [parameters] 2>&1 | wtee log.txt
,您应该写下以下内容:
(test_name.bat [parameters] 2>&1 1> con) | wtee log.txt
这会将 STDOUT 中的文本写入控制台,将 STDERR 中的数据重定向到 STDOUT ,然后将其传递给{ {1}}命令。
请注意,控制台会在任何 STDERR 数据之前显示所有原始 STDOUT ,因为前者会立即显示,而后者会通过wtee
传递。使用纯重定向黑客,无法保留返回数据的原始顺序。 如果您坚持这一点,则需要使用具有所需功能的 编辑: 在特别是,管道是瓶颈,因为只有一个通道,即 STDIN ,它将数据传递给。因此,如果您坚持以原始顺序显示 STDOUT 和 SRDERR 数据,同时将一个流的数据保存到文件中,则除了修改之外别无选择脚本wtee
以外的工具。wintee
并避免管道。
我试图解释使用管道左侧的命令test_name.bat
,它在 STDOUT 和 STDERR 处产生输出(因为无效路径dir ":"
):
":"
STDERR 上显示D:\Data> dir ":"
Volume in drive D has no label.
Volume Seriel Number is 0000-0000
Directory of D:\Data
File Not Found
消息,而其余消息显示在 STDOUT (您可以通过重定向File Not Found
或{{ 1}}解除其中一个流。)
在管道的右侧,我使用命令2> nul
,它只是传递它在 STDIN 处收到的所有数据,并在控制台上显示它:
1> nul
控制台输出的更改顺序说明了发生的情况: STDERR 立即显示,而 STDOUT 在显示之前首先通过管道。
现在让我们从命令行应用重定向find /V ""
:
D:\Data> dir ":" | find /V ""
File Not Found
Volume in drive D has no label.
Volume Seriel Number is 0000-0000
Directory of D:\Data
这会将 STDERR 重定向到 STDOUT ,因此原始的 STDOUT 数据与重定向的数据一起通过管道传输。用2>&1
替换D:\Data> (dir ":" 2>&1) | find /V ""
Volume in drive D has no label.
Volume Seriel Number is 0000-0000
Directory of D:\Data
File Not Found
证明管道的右侧确实接收了所有数据。
现在让我们添加find /V ""
部分,它构成 STDOUT 到控制台的显式重定向:
(> nul find /V "")
输出包含所有原始数据。再次将1> con
替换为D:\Data> (dir ":" 2>&1 1> con) | find /V ""
Volume in drive D has no label.
Volume Seriel Number is 0000-0000
Directory of D:\Data
File Not Found
证明了这一次,管道的右侧确实只接收了find /V ""
消息,该消息最初出现在 STDERR ,但是 STDOUT 数据不会通过管道传输。
只是旁注:
如果您想使用纯batch-file执行(> nul find /V "")
之类的操作,事情会变得非常复杂 - 请参阅this example ...