795                   
               

我正在尝试将Windows 命令的所有输出(stdout + stderr)重定向到单个文件:                    

C:\>dir 1> a.txt 2> a.txt The process cannot access the file because it is being used by another process.                        
                   

是否有可能,或者我应该只重定向到两个单独的文件?                  

                 
  • 22                                
    TechNet:使用命令重定向运算符(比这里的任何答案都更好地回答这个问题)。 
    – 马丁·普利克里尔                                   
     2016 年 5 月 11 日 6:09                                 
  • 1                                
    2>&1 因为它不能重新打开同一个文件 
    – 卢克                                   
     2018 年 5 月 24 日 5:13                                                                        
        

7 个答案  正确答案                    

        
1256                       
                    

你要:                        

             1) 把正确和错误都输出到 a.txt                         

               dir > a.txt 2>&1
                  语法   >&1 会将   2  (stderr) 重定向到     1 (stdout)。您还可以通过重定向到 来隐藏消                      息   NULL                             

                 更多解释和示例在 Microsoft 文档页面Redirecting error messages from Command Prompt: STDERR/STDOUT                        

                                      

               2) 把正确和错误都追加到 a.txt                         

                       

                 dir  >> a.txt 2>&1
                 
                 
              3)  仅把错误都输出到 a.txt
                   dir   2  > a.txt
                   
              4)   仅把正确都输出到 a.txt
                  dir    > a.txt  或者  dir   1  > a.txt                    
      

要将错误消息重定向到 NUL,请使用以下命令:                        

dir file.xxx 2> nul
                       

或者,您可以将输出重定向到一个地方,并将错误重定向到另一个地方。                        

dir file.xxx 1> output.msg 2>&1                                                   

                       

&1
您可以使用以下命令将 STDERR 的输出重定向到 STDOUT,然后将输出从 STDOUT 发送到文件,将错误和标准输出打印到单个文件:                        


                       

dir file.xxx 1> output.msg 2>&1


把 标准输出至屏幕 这个看不懂,不是我期望的那样
# net user /domain JS.FG.WH.PPS  1>stdout

把 错误输出至屏幕 这个看不懂,不是我期望的那样
# net user /domain JS.FG.WH.PPS  2>stdout


谢谢你,不知道这个unix shell语法也适用于DOS!
– 链轮起子
2012 年 8 月 14 日 17:00
25
这非常适合隐藏所有输出.. net stop w3svc >NUL 2>&1.. 谢谢!
– 科迪布朗
2013 年 4 月 4 日 17:55
4

18
如果有句柄,句柄(即2)和重定向运算符(即>)之间不能有空格。因此2> 2.txt有效(或2> &1) 2 > 2.txt无效;2 > &1才不是。
– 红豌豆
2015 年 4 月 3 日 21:41
2
微软没有原生T恤真是太可惜了
– JJS
2016 年 10 月 24 日 17:19

来自 Microsoft 文档的背景信息
虽然这个问题的公认答案是正确的,但它实际上并不能解释它为什么起作用,而且由于语法不是很清楚,
我做了一个快速的 www 搜索以找出实际发生的情况。希望这些信息对其他人有所帮助,我将其发布在这里。
取自 Microsoft 文档页面:
从命令提示符重定向错误消息:STDERR/STDOUT
概括
使用>符号重定向应用程序的输出时,错误消息仍会打印到屏幕上。这是因为错误消息
通常发送到标准错误流而不是标准输出流。
控制台(命令提示符)应用程序或命令的输出通常发送到两个单独的流。
常规输出发送到标准输出 (STDOUT),错误消息发送到标准错误 (STDERR)。当您使用>符号重定向控制台输出时,
您只是重定向 STDOUT。为了重定向 STDERR,您必须指定2>重定向符号。这将选择第二个输出流,即 STDERR。
例子
该命令dir file.xxx(其中 file.xxx 不存在)将显示以下输出:
驱动器 F 中的卷是 Candy Cane 卷序列号是 34EC-0876
找不到文件
如果您使用 将输出重定向到 NUL 设备dir file.xxx > nul,您仍然会看到错误消息:
文件未找到
要将错误消息重定向到 NUL,请使用以下命令:
dir file.xxx 2> nul 或者,您可以将输出重定向到一个地方,并将错误重定向到另一个地方。
dir file.xxx 1> output.msg 2>&1 &1您可以使用以下命令将 STDERR 的输出重定向到 STDOUT,然后将输出从 STDOUT 发送到文件,
将错误和标准输出打印到单个文件:
dir file.xxx 1> output.msg 2>&1

来自  https://stackoverflow.com/questions/1420965/how-to-redirect-windows-cmd-stdout-and-stderr-to-a-single-file