與Unix/Linux 一樣,DOS使用三個通用的“文件流”來進行輸入,輸出文本信息或者錯誤信息。程序或者腳本使用標準輸入文件(stdin)讀取內容,標準輸出(stdout)輸出文件或者打印文本到屏幕上,標準錯誤(stderr)輸出錯誤信息到屏幕上。
File Numbers
這三個標準文件(也稱為標準流)使用數字 0,1,2 進行標記。標準輸入是文件0,標準輸出是文件1,標準錯誤是文件2。下文中的文件流重定向會用到這三個數字。
Redirection[1]
批處理腳本經常需要把一些程序的日志輸出的一個文本文件。 >
操作符可以將標準輸出或者錯誤重定向到一個文件。比如,列出當前目錄下的文件信息,并存儲到一個文本文件,可以這么操作:
DIR > temp.txt
>
操作符會覆蓋目標文件的內容, >>
操作符則是將內容追加至文件末。
DIR > temp.txt
DIR >> temp.txt
默認情況下,>
、>>
是將標準輸出重定向。 也可以在操作符前加上 2
(注意沒有空格) 來重定向標準錯誤。
DIR SomeFile.txt 2>> error.txt
也可以通過>&
運算符,將標準輸出、錯誤相互轉換。 例如,將標準輸出轉為異常來輸出到error.txt
Some.exe 2> error.txt 1>&2
通過幾個例子看下, 將下邊的內容保存為 test.cmd
@ECHO OFF
ECHO Hello
some.exe
- 使用默認輸出,
test.cmd > log.txt
log.txt :
Hello
`log.txt` 只包含了正常的消息內容, 屏幕上輸出了錯誤信息:
>'some.exe' 不是內部或外部命令,也不是可運行的程序或批處理文件。
- 使用
test.cmd 1> log.txt
輸出
log.txt :
Hello
同上,`log.txt` 同樣包含了正常的消息內容,屏幕上輸出了錯誤消息。 說明,默認的`>` 與 `1>` 相同。
- 使用
test.cmd 2> log.txt
輸出
log.txt :
'some.exe' 不是內部或外部命令,也不是可運行的程序或批處理文件。
`log.txt` 只輸出了異常的消息內容,屏幕輸出了正常的消息。
- 使用
test.cmd > log.txt 1>&2
輸出
log.txt :
`log.txt`的內容為空白,屏幕上輸出了正常與錯誤的消息。 這行命令的作用是將`stdout`當作`stderr`處理,并把`stdout`輸出到`log.txt`,所以`stdout`顯示在了屏幕上,`log.txt`為空白。
- 使用
test.cmd 2> log.txt 1>&2
輸出
log.txt :
Hello
'some.exe' 不是內部或外部命令,也不是可運行的程序或批處理文件。
`log.txt`包含了正常與錯誤的消息。 這行命令的作用是將`stdout`當作`stderr`處理,并將`stderr`輸出到`log.txt`
使用 <
運算符可以將文件內容讀入程序或者腳本。例如:
SORT < SomeFile.txt
SomeFile.txt
的內容為:
2
4
1
3
SORT < SomeFile.txt > result.txt
result.txt
的內容為:
1
2
3
4
Suppressing Program Output
NUL
是一個虛擬的設備(文件),將stdout
重定向到NUL
,則會丟棄標準輸出。例如:
ping 127.0.0.1 > NUL
屏幕上不會輸出任何內容。在比如屏蔽掉錯誤輸出,以上文中的test.cmd
腳本為例,
test.cmd 2> NUL
Hello
只輸出了 Hello, 錯誤的內容并沒有輸出。
Redirecting Program Output As Input to Another Program
如果要把一條命令的輸出作為另外一條命令的輸入,可以借助|
操作符來完成。例如將當前目錄下的文件排序:
DIR /B | SORT
倒序:
DIR /B | SORT /R
A Cool Party Trick
有個技巧可以在命令提示符窗口中創建文本文件或者腳本,通過CON
將命令提示符自己的輸入重定向到一個文件。輸入完成后需要按下Ctrl
+ C
, 發送一個結束符(EOF)。
TYPE CON > output.txt
類似的技巧還有許多,比如新建一個空文本:
TYPE NUL > w.txt
在DOS上還有一些其他的特殊設備可以重定向,但是大多數有點類似于LPT1(用于并行端口打印機)和COM1(用于串口設備,如調制解調器)。