将 Windows cmd 中的命令输出写入文件(略有不同)

将 Windows cmd 中的命令输出写入文件(略有不同)

所以我试图运行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 时,我确实会得到有效的输出,但它不会很好地打印到文件中。显然输出是存在的,问题是是否有某种方法可以捕获它。

答案1

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

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

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. 流 1 被称为STDOUT或者标准输出。通常,程序编写自己的“普通的”输出至流 1。

  2. 流 2 被称为STDERR或者标准误差。通常,程序编写自己的“错误”输出(错误和警告消息)到流 2。

程序是否将特定输出写入STDOUT或者STDERR取决于程序员及其编写程序的方式。有些程序被编写为将所有输出(正常输出和错误)发送到STDOUT

当程序运行时没有输出重定向,所有正常和错误输出都会发送到终端屏幕,而不区分STDOUT输出或STDERR输出。

当你使用单个>像这样:

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

你没有指定哪个溪流正在重定向到文件,因此假定为流 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 重定向到相同的“地方”(文件)作为流 1。


编辑:

Pacerier 问道:

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:\输出.txt” 2>“c:\输出.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显示在屏幕上......这是预期的行为。

现在,使用两个重定向(“>file”和“2>file”):

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 字节),并且两个重定向的输出都丢失了。

现在,最后,使用两个重定向(“>file”和“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>

在这种情况下,“>file”会导致“流 1”(“标准输出”)的输出被捕获到文件中。而“2>&1”会导致“流 2”(“错误输出”)的输出通过已经重定向的“流 1”发送,并且也被捕获到(同一)文件中。

还值得注意的是,顺序很重要。反转顺序如下:

dir nonexistant 2>&1 >output.txt

并不相同,并且可能不会给您期望的结果。

在这种情况下,首先看到并处理的“2>&1”会导致“流 2”(“错误输出”)的输出重定向到“流 1”当前指向的位置,此时(默认情况下)是屏幕。而“>file”会导致“流 1”(“标准输出”)的输出被捕获到文件中。最终结果是,命令(“流 1”)的输出将被捕获到文件中,但错误输出(“流 2”)仍将转到屏幕上(而不是文件上)。

相关内容