将Windows cmd中的命令输出写入文件(带有扭曲)


9

因此,我尝试运行foo.exe,但是我不希望输出到终端而是进入文件。跑步foo.exe > foo.txt应该为我完成,但不是。当我运行exe文件时,得到输出。换句话说,exe工作正常。但是,当我尝试将输出发送到文件时,唯一得到的是:

'c:/Program' is not recognized as an internal or external command,
operable program or batch file.

不仅显示了,当我尝试把它发送到一个文件中。考虑到可能c:\Program Files (x86)\是错误解释的路径(等等),我尝试像这样指定输出文件:foo.exe > c:\test.txt,但仍然没有乐趣。

因此,除了指出我尝试运行的二进制文件编写得很差之外,还有什么我可以做些补救的措施吗?请记住,仅在运行exe时我确实会获得有效的输出,但它不会很好地打印到文件中。显然输出在那儿,问题是是否有某种方法可以捕获它。


如果将程序移到简单目录(C:\ Simple甚至C:\),然后从那里尝试这些操作,会发生什么?
Jan Doggen

Answers:


22

您尚未显示正在使用的命令失败。如果您在问题中显示它,可能更容易为您找到解决方案。

我希望您的命令是这样的:

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而不是STDOUTfoo.exe则不能通过使用带有单个的简单重定向来捕获的输出>。您必须这样做:

foo.exe>"c:\Program Files (x86)\something\test.txt" 2>&1



编辑:

这是文件重定向和2>&1表示法的说明。

当程序写入终端时,它可以写入两个之一Streams

  1. 流1称为STDOUT标准输出。通常,程序将其“ Normal”输出写入流1。

  2. 流2称为STDERR标准错误。通常,程序将其“错误”输出(错误和警告消息)写入流2。

程序是否向其写入特定的输出STDOUTSTDERR由程序员决定,以及他们如何编写程序。编写了一些程序以将所有输出(正常输出和错误)发送到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)的程序输出捕获到指定的文件名。将11>指流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”)仍将到达屏幕(而不是文件)。


事实证明这foo.exe>"c:\test.txt"确实有效,但是它引发了一个错误,程序崩溃了(尽管输出仍然存在)。但是,随着2>&1坠机投诉的消失,您的建议使情况变得更好。想要详细说明它的作用吗?再次感谢您的答复。
pzkpfw

@ bigbadonk420-我更新了答案,以包含有关的使用信息2>&1。如果您检查文件“ c:\ test.txt”,则很可能会看到“崩溃投诉”已写入该文件。2>&1不应导致或防止程序崩溃,它只会导致捕获错误消息,而不是显示错误消息。
凯文·费根

1
好吧,出于某种原因。
pzkpfw

1
@ bigbadonk420- 'for some reason it does'重定向会以什么方式影响它?您是说重定向包括时2>&1,不会发生此错误吗?发生错误时,您会看到什么错误消息?
凯文·费根

1
如果2>&1不包含,该程序崩溃,我得到了标准的Windows“该程序停止响应”对话框。当我包含它时,它不包含在内。不知道为什么。在两种情况下都会生成输出。
pzkpfw
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.