您尚未显示正在使用的命令失败。如果您在问题中显示它,可能更容易为您找到解决方案。
我希望您的命令是这样的:
C:\>
foo.exe|c:\Program Files (x86)\something\test.txt
您收到的错误有些线索:
'c:/Program' is not recognized as an internal or external command, operable program or batch file.
第一:
... is not recognized as an internal or external command, operable program or batch file.
当您尝试使用|
而不是重定向到文件时,通常会发生这种情况>
。
第二:
'c:/Program' ...
指定包含空格的文件名(或路径)时,必须用双引号("..."
)括起来。这是因为,当操作系统确定要重定向到的文件时,如果遇到未加引号的空格,它将停止寻找文件名"c:/Program"
。
尝试这个:
foo.exe>"c:\Program Files (x86)\something\test.txt"
如果以上方法无法捕获foo.exe
文本文件的输出,则还有另一种可能性...
如果程序foo.exe
正在将输出写入STDERR
而不是STDOUT
,foo.exe
则不能通过使用带有单个的简单重定向来捕获的输出>
。您必须这样做:
foo.exe>"c:\Program Files (x86)\something\test.txt" 2>&1
编辑:
这是文件重定向和2>&1
表示法的说明。
当程序写入终端时,它可以写入两个之一Streams
。
流1称为STDOUT
或标准输出。通常,程序将其“ Normal”输出写入流1。
流2称为STDERR
或标准错误。通常,程序将其“错误”输出(错误和警告消息)写入流2。
程序是否向其写入特定的输出STDOUT
或STDERR
由程序员决定,以及他们如何编写程序。编写了一些程序以将所有输出(正常输出和错误)发送到STDOUT
。
在没有输出重定向的情况下运行程序时,所有正常和错误输出都将发送到终端屏幕,而不会区别STDOUT
输出或STDERR
输出。
当您>
像这样执行“常规”重定向时:
foo.exe > "c:\Program Files (x86)\something\test.txt"
您没有指定将哪个Stream重定向到文件,因此假定为Stream 1。
就像您这样输入一样:
foo.exe 1> "c:\Program Files (x86)\something\test.txt"
这告诉命令解释器(cmd.exe
)将STDOUT
(流1)的程序输出捕获到指定的文件名。将1
在1>
指流1。
在这种情况下,所有正常程序都被捕获到文件中,但是如果该程序写入STDERR
(流2),则该输出将不会被捕获并显示在屏幕上。通常,这是执行此操作的“理想”方法,因此在捕获正常程序输出时,可以在屏幕上看到是否发生错误。
如果要将“普通”输出捕获到一个文件中,而将“错误”输出捕获到另一个文件中,则可以这样进行:
foo.exe > "c:\output.txt" 2> "C:\error.txt"
or
foo.exe 1> "c:\output.txt" 2> "C:\error.txt"
如果要将“正常”输出和“错误”输出捕获到同一文件,则可以这样指定:
foo.exe > "c:\output.txt" 2>&1
这基本上是指定它的“捷径”方式,它意味着将Stream 1重定向到指定的文件,并且还将Stream 2重定向到与Stream 1 相同的“位置”(文件)。
编辑:
佩斯里尔问:
foo.exe>“ c:\ output.txt” 2>&1和foo.exe>“ c:\ output.txt” 2>“ c:\ output.txt”有什么区别吗?它们相同吗?
简短的答案:您会认为它们是相同的,但不相同。他们是不同的。
随着重定向使用>"filename.ext"
,1>"filename.ext"
或者2>"filename.ext"
,将>
导致输出被写入到一个新的名为“FILENAME.EXT”文件。如果文件“ filename.ext”已经存在,它将首先被删除。
因此,使用:
foo.exe>“ c:\ output.txt” 2>“ c:\ output.txt”
导致“冲突”,其中两个重定向都试图写入同一文件,如果文件已经存在,则两者都试图删除该文件。这可能会导致不良行为。通常,输出中的一个或另一个或两个都不会被完全捕获或无法预测。
实际结果将取决于操作系统和版本,也可能取决于正在执行的命令。可能发生的情况是:
1发送到重定向之一的输出将被捕获或部分捕获,发送到其他重定向的输出将丢失。2操作系统将抱怨该命令,并且不会完全捕获任何输出。3未定义,不希望发生,无法预测的意外行为。
在Windows 7以及可能在Windows Vista / 8/10和Windows XP上,操作系统将抱怨命令,并且该命令将被取消。
例如(Windows 7):我有一个名为:"C:\Temp\emptyfolder"
的文件夹,并且那里不存在名为“ nonexistantfile”的文件。
C:\>cd "\Temp\emptyfolder"
C:\Temp\emptyfolder>dir nonexistantfile>output.txt
File Not Found
C:\Temp\emptyfolder>type output.txt
Volume in drive F is FFFFx1tb
Volume Serial Number is 4011-A5C6
Directory of C:\Temp\emptyfolder
C:\Temp\emptyfolder>
在这种情况下,使用一种重定向(>output.txt
),将dir
命令的输出捕获到文件:中output.txt
,并且File Not Found
屏幕上显示错误消息 ...这是预期的行为。
现在,使用两个重定向(“>文件”和“ 2>文件”):
C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>output.txt
The process cannot access the file because it is being used by another process.
C:\Temp\emptyfolder>type output.txt
C:\Temp\emptyfolder>
在这种情况下,操作系统抱怨(outout)文件已被使用。并且文件“ output.txt”最终为空(0字节),并且两个重定向的输出都丢失了。
现在,最后,使用两个重定向(“>文件”和“ 2>&1”):
C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>&1
C:\Temp\emptyfolder>type output.txt
Volume in drive C is CCCCCCCC
Volume Serial Number is 1234-ABCD
Directory of C:\Temp\emptyfolder
File Not Found
C:\Temp\emptyfolder>
在这种情况下,“文件”会导致“流1”的输出(“标准输出”)被捕获到文件中。“ 2>&1”使“流2”的输出(“错误输出”)通过已重定向的“流1”发送,并也被捕获到(相同)文件中。
还值得注意的是顺序很重要。像这样反转顺序:
dir nonexistant 2>&1 >output.txt
是不一样的,可能不会给您想要的结果。
在这种情况下,首先看到并进动的“ 2>&1”会使“流2”的输出(“错误输出”)重定向到当前指向“流1”的位置。此刻(默认情况下)是屏幕。“文件”使“流1”的输出(“标准输出”)被捕获到文件中。最终结果是命令的输出(“流1”)将被捕获到文件中,但是错误输出(“流2”)仍将到达屏幕(而不是文件)。