DOS的管道、重定向等
DOS的命令中的管道操作:
在使用Nir Friedman的程序時,算feature的ComputeBootEst的命令行當時很費解:
type *.net | ComputeBootEst [option]
上網查了些資料終于知道,“|” 在DOS中的作用是將左邊程序的輸出作為右邊程序的輸入,像在兩程序間接了一條管道。結合重定向符號“<”、“>”還有很靈活的應用。隨便引一篇,姑且存著,以后細看:
DOS的批處理文件十分有用,我們可以把經常使用的命令編寫為批處理文件,由計算機來實現對系統的自動加載, 完成這些重復工作。今介紹幾個批處理文件的使用技巧:
(一)應用DOS重定向功能
DOS的標準輸入輸出通常是在標準設備鍵盤和顯示器上進行的, 利用重定向,可以方便地將輸入輸出改向磁盤文件或其它設備。如在批處理命令執(zhí)行期間為了禁止命令或程序執(zhí)行后輸出信息而擾亂屏幕, 可用DOS重定向功能把輸出改向NUL設備(NUL不指向任何實際設備): C:\>COPY A.TXT B.TXT > NUL。
命令執(zhí)行結束不顯示"1 file(s) copied"的信息。有的交互程序在執(zhí)行時要求很多鍵盤輸入, 但有時輸入是固定不變的, 為加快運行速度, 可預先建立一個輸入文件,此文件的內容為程序的鍵盤輸入項, 每個輸入項占一行。假如有一個程序ZB, 其輸入項全部包括在文件IN.DAT中, 執(zhí)行 C:\>ZB <IN.DAT >NUL 程序就自動執(zhí)行。
(二)應用DOS管道功能
DOS的管道功能是使一個程序或命令的標準輸出用做另一個程序或命令的標準輸入。如把DEBUG的輸入命令寫入文件AAA, 用TYPE命令通過管道功能將AAA的內容傳輸給DEBUG, 在DEBUG執(zhí)行期間不再從控制臺索取命令參數, 從而提高了機器效率。命令為: C:\>TYPE AAA|DEBUG >BBB。
(三)子程序
在一個批處理文件可用CALL命令調用另一個子批處理文件, 當子批文件執(zhí)行結束后,自動返回父批文件, 繼續(xù)向下執(zhí)行。如: A.BAT B.BAT,A調用B,A.BAT內容如下:
@ECHO OFF
CALL B
CD \BASIC
BASICA BG
@ECHO ON
(四)菜單選擇功能
DOS功能調用31H或4CH所提供的一字節(jié)的返回碼, 通過批處理子命令IF和ERRORLEVEL對返回碼進行處理, 可達到自動執(zhí)行一批命令的目的。在批處理文件中實現高級語言所有的菜單提示功能, 使批處理文件變得更靈活方便。先用DEBUG建立一個菜單驅動程序MENU.COM,對應地編寫一個批處理文件LG.BAT。具體內容和方法見下表:
DEBUG
-A
-166C:0100 MOV DX,111
-166C:0103 MOV AH,09
-166C:0105 INT 21
-166C:0107 MOV AH,01
-166C:0109 INT 21
-166C:010B MOV AH,4C
-166C:010D INT 21
-166C:010F INT 20
-166C:0111 DB '******************************'0D 0A
-166C:0131 DB '* 1.Turbo Pascal 5.00 *'0D 0A
-166C:0151 DB '* 2.Turbo Basci 1.00 *'0D 0A
-166C:0171 DB '* 3.Turbo Prolog 2.00 *'0D 0A
-166C:0191 DB '* 4.Turbo C 2.00 *'0D 0A
-166C:01B1 DB '* 0.Exit *'0D 0A
-166C:01B1 DB '******************************'0D 0A
-166C:01F1 DB 'Your choice(0..4) : '24 0D 0A 1A
-166C:0209
-R CX
CX 0000
:108
-N MENU.COM
-W
Writing 0108 bytes
-Q
@ECHO OFF:
START
CLS
MENU
IF ERRORLEVEL 52 GOTO C
IF ERRORLEVEL 51 GOTO PRO
IF ERRORLEVEL 50 GOTO BAS
IF ERRORLEVEL 49 GOTO PAS
IF ERRORLEVEL 48 GOTO EX
CLS
GOTO START
:PAS
CD \TP5.00
TURBO
CD \
GOTO START
:BAS
CD \TB
TB
CD \
GOTO START
:PRO
CD \TPROLOG
PROLOG
CD \
GOTO START
:C
CD \TURBOC
TC
CD \
GOTO START
:EX
@ECHO ON
執(zhí)行LG, 屏幕左上角出現一個菜單, 并提示用戶輸入選擇, 當選擇的功能執(zhí)行結束,重新返回主菜單請求選擇, 直到選擇"0"號功能, 程序結束返回DOS。
(五)應用命令處理程序完成大量重復工作
DOS提供調用次級命令程序的方法, 可實現與子程序等效的功能, 在MS DOS3.3以前的DOS版本下非常有用。如你有一批FORTRAN源程序需要編譯, 首先編寫兩個批文件MAKEOBJ.BAT、C.BAT, 然后執(zhí)行MAKEOBJ, 即可把當前目錄下的所有擴展名為.FOR的FORTRAN源程序編譯成OBJ文件。這種方法迅速正確, 人機交互少, 減輕了程序員的
MAKEOBJ.BAT C.BAT
@ECHO OFF
ECHO COMPILE FORTRAN PROGRAMS.
FOR %%A IN (*.FOR) DO COMMAND /C C %%A
ECHO FINISH !
@ECHO ON @ECHO OFF
ECHO ------ COMPILE %1 ------
FOR1 %1; >NUL
FOR2 >NUL
@ECHO ON
正確熟練地應用批處理文件, 可以給你的工作帶來事半功倍的效果。利用本文介紹的方法你可以方便地編寫出一個應用系統的主控模塊, 與高級編寫的模塊一樣好用, 且更為簡便。以上的程序均在PC/AT上通過, 操作系統為PC DOS3.30。
簡介For命令具體格式及在Windows中的妙用
日期:2004-07-09
在Windows中,我們經常要批量地來完成相同的工作,很多用戶往往是上網搜索第三方軟件來完成。其實在Windows中,巧妙地利用For命令就可以很輕松地完成很多批量工作。為了更好地理解我們的下一步實戰(zhàn),先讓我們來看一下For命令的用法。For命令的具體格式如下:
For %variable IN (set) do command [command-parameters],
%variable——指定一個單一字母可替換的參數
(set)——指定一個或一組文件,可以使用通配符
command——指定對每個文件執(zhí)行的命令
command-parameters——為特定命令指定參數或命令行開關
在批處理文件中使用 For 命令時,指定變量請使用“%%variable”,而不要用“ %variable”。變量名稱是區(qū)分大小寫的,所以“%i”不同于“%I”。由于For命令的用法和參數非常多,變化復雜,這里因篇幅原因就不再一一羅列了,用戶可以在命令提示符后鍵入“For /?”來獲得具體幫助。下面我們將直接進入實戰(zhàn),并結合實戰(zhàn)講述For命令的具體用法。
1. 給文本文件批量加上落款
在很多情況下,我們編輯處理完文檔,都要給文件加上一個包括“通信地址、QQ、E-MAIL等等信息”的落款,如投往編輯部的稿件。如果只有一篇文章,直接輸入倒也罷了,但假如你有很多這樣的文件,該怎么辦呢?難道每一篇稿件都要手工一個字一個字地輸入那一成不變的落款嗎?NO!完全沒有必要這樣費神,我們可以一次性地給所有文件添加上落款,假如我們要給放在“ABCDE”目錄下的所有文本文件加上落款。那么就請先建一個名為Address.txt的文本文件,錄入通信地址、QQ、E-mail等等信息,保存到E盤的根目錄。
再新建一個文本文件,錄入以下內容:
MD E:\TEMPabcde
for /r E:\ABCDE %%I in (*.txt) do copy %%I+E:\address.txt E:\tempABCDE\
for /r E:\tempABCDE %%I in (*.txt) do copy %%I E:\ABCDE\
echo y|del E:\TEMPabcde
echo y|rd E:\TEMPabcde
錄入完畢,經檢查確認無誤后,另存為“給文件加落款.bat”,也保存到E盤的根目錄?,F在,只需雙擊此批處理文件,就可以為E:\ABCDE文件夾中所有的TXT文件加上落款。
提示:For命令指定參數“%I”從“E:\ABCDE”文件夾中的所有文本文件中取值 ;“/r”參數表示包括子目錄。
2. 批量獲取文件列表
如果我們需要制作某個目錄下的文件清單,如電影文件的文件清單,可以用For命令來輕松完成。我們以制作F盤上的所有RM格式的電影文件的清單為例:
先在F盤根目錄下建一個名為“列文件清單.bat”的文本文件,然后輸入以下內容并保存:
For /r F:\ %%i in (*.rm) DO @echo %%~fi >>F:\RMList.txt
雙擊此批處理文件,即可快速列出F盤上所有的以RM為擴展名的電影文件的清單。
提示:For命令指定參數“%i”從F盤的所有以RM為擴展名的文件中取值;“@echo %%fi”表示將所有的RM文件及其完整路徑顯示出來;“>>F\RMList.txt”表示將輸出結果重定向到F\RMList.txt文件中,打開該文件,即可看到詳細的目錄清單;“f”表示完整路徑。還可以使用“%n”(文件名)、“%x”(文件擴展名)、“%d”(驅動器)、“%p”(路徑)、“%s”(完整路徑)、“%t”(文件日期)、“%z”(文件大小)等參數。
3. 快速刪除磁盤上的空文件夾
假設我們要清理D盤上的空文件夾,那么請先用記事本建一個名為“kill.bat”的文件,在該文件中輸入以下內容:
dir d:\ /ad /b /s |sort /r >>d:\kill.txt
For /f %%i in (d:\kill.txt) DO rd %%i
echo y |del d:\kill.txt
先查找并刪除全部“Thumbs.db”文件,然后雙擊該文件,D盤上所有的空文件夾很快就消失的無影無蹤了。
提示:“dir d:\”表示列D盤上的所有目錄包括子目錄列表,其中參數“/ad”表示列所有目錄;參數“/b”表示只列出文件夾名稱而不顯示標題信息或摘要:參數“/s”表示搜索,即查找D盤中的所有文件夾和子文件夾;“|”是管道符號,將Dir命令的結果傳遞給“sort”命令;“sort”命令表示排序;“/r”表示逆序列排序。之所以要逆序列排序,是因為通過逆序列排序后,D盤上的所有子文件夾總是會位于其父文件夾的前面,這樣在用For命令刪除空文件夾時,空的子文件夾被首先刪除了,因此空的父文件夾就可以刪除了。否則,因空的父文件夾中尚有空的子文件夾,會造成無法刪除的情況。“>>d:\kill.txt”的作用是讓屏幕回顯重新定位到“d:\kill.txt”文件中。
For 命令中參數“/f”的作用是讓For命令從指定的文件中讀取數據作為變量,示例是從Dir的結果文件“d:\kill.txt”文件中讀取數據,每次讀取一行傳遞給RD命令;RD命令的作用是刪除由For命令傳遞過來的每一個文件夾,因RD命令無法刪除尚有內容的文件夾,所以經過For命令的循環(huán)后,只是刪除了所有的空文件夾,有內容的文件夾會完好無損地被保留下來。
4. 批量獲取局域網中所有IP地址與主機名的對應關系
如果你是網管,肯定需要獲取一張本網段內所有IP地址與主機名的對照表。如果你不想使用第三方軟件的話,不妨用For命令試試。
在命令提示符窗口中輸入以下命令:
For /L %i in (0,1,254) DO ping -a -n 1 192.168..0.%i |Find /i "reply" >>E:\IPAddress.txt
好了,等命令執(zhí)行完畢,打開“E:\IPAddress.txt”文件,一張完整的IP與主機名的對照表已經初步形成了,你只需作簡單的編輯修改即可打印輸出了。
提示:For命令指定參數“%i”從0開始,每次增加1,直到254為止,即一個C類網段的全部地址。如果用戶的局域網自行定義的了IP地址,應根據實際情況設置,如可以為“172.16.0”;“-a”表示獲取主機名;“-n -1”表示回顯的次數為1次,默認情況下為4次;Find /i "reply“表示查找已響應的主機,即已ping通的主機;“E:\IPAddress.txt”表示將屏幕回顯內容輸入到“:\IPAddress.txt”文件中。
使用命令重定向操作符
更新日期: 01/21/2005
使用命令重定向操作符
可以使用重定向操作符將命令輸入和輸出數據流從默認位置重定向到其他位置。輸入或輸出數據流的位置稱為句柄。
下表將列出可用的句柄。
句柄 句柄的數字代號 描述
STDIN
0
鍵盤輸入
STDOUT
1
輸出到命令提示符窗口
STDERR
2
錯誤輸出到命令提示符窗口
UNDEFINED
3-9
句柄由應用程序單獨定義,它們是各個工具特有的
數字 0 到 9 代表前 10 個句柄??梢允褂妹?Cmd.exe 運行程序,并對該程序前 10 個句柄中的任何一個句柄進行重定向。要指定要用的句柄,請在重定向操作符之前鍵入該句柄的數字。如果未定義句柄,則默認的 < 重定向輸入操作符是 0,而默認的 > 重定向輸出操作符是 1。鍵入 < 或 > 操作符之后,必須指定數據的讀寫位置??梢灾付ㄎ募蚱渌F有的句柄。
要指定重定向到現有句柄,請使用與 (&) 字符,后面接要重定向的句柄號(即 &句柄號)。例如,下面的命令可以將句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):
2>&1
下表列出了可用于重定向輸入和輸出數據流的操作符。
重定向操作符 描述
>
將命令輸出寫入到文件或設備(如打印機),而不是命令提示符窗口或句柄。
<
從文件而不是從鍵盤或句柄讀入命令輸入。
>>
將命令輸出添加到文件末尾而不刪除文件中已有的信息。
>&
將一個句柄的輸出寫入到另一個句柄的輸入中。
<&
從一個句柄讀取輸入并將其寫入到另一個句柄輸出中。
|
從一個命令中讀取輸出并將其寫入另一個命令的輸入中。也稱作管道。
默認情況下,可以從鍵盤將命令輸入(即 STDIN 句柄)發(fā)送到 Cmd.exe,然后由 Cmd.exe 將命令輸出(即 STDOUT 句柄)發(fā)送到命令提示符窗口。
返回頁首
重定向輸入 (<)
要通過鍵盤將輸入重定向到文件或設備,請使用 < 操作符。例如,要從 File.txt 獲取 sort 命令的輸入,請鍵入:
sort<file.txt
File.txt 的內容將以字母順序列表的方式顯示在命令提示符窗口中。
< 操作符可以打開具有只讀訪問權限的指定文件名。因此,不能在使用該操作符時向文件中寫入信息。例如,如果以 <&2 啟動程序,則所有試圖讀取句柄 0 的操作都將失敗,因為句柄 2 最初是以只寫訪問方式打開的。
注意
• 0 是 < 重定向輸入操作符的默認句柄。
返回頁首
重定向輸出 (>)
幾乎所有的命令都將輸出發(fā)送到命令提示符窗口。即使將輸出發(fā)送到驅動器或打印機的命令也會在命令提示符窗口顯示消息和提示。
要將輸出從命令提示符窗口重定向到文件或設備,請使用 > 操作符??梢栽谠S多命令中使用該操作符。例如,要將 dir 輸出重定向到 Dirlist.txt,請鍵入:
dir>dirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 將創(chuàng)建該文件。如果 Dirlist.txt 存在,Cmd.exe 將使用 dir 命令的輸出替換文件中的信息。
要運行 netsh routing dump 命令,然后將輸出發(fā)送到 Route.cfg,請鍵入:
netsh routing dump>c:\route.cfg
> 操作符可以打開具有只寫訪問權限的指定文件。因此,不能使用該操作符讀取文件。例如,如果使用重定向操作符 >&0 啟動程序,則寫入句柄 1 的所有嘗試操作都將失敗,因為句柄 0 最初是以只讀訪問方式打開的。
注意
• 1 是 > 重定向輸出操作符的默認句柄。
返回頁首
復制句柄
重定向操作符 & 可以將輸出或輸入從一個指定句柄復制到另一個指定的句柄。例如,要將 dir 輸出發(fā)送到 File.txt 并將錯誤輸出發(fā)送到 File.txt,請鍵入:
dir>c:\file.txt 2>&1
復制句柄時,可以復制該句柄原狀態(tài)的所有特性。例如,如果一個句柄具有只讀訪問的屬性,則該句柄的所有副本都具有只讀訪問屬性。不能將一個具有只讀訪問屬性的句柄復制到另一個具有只寫訪問屬性的句柄。
返回頁首
使用 & 操作符重定向輸入和副本
要將重定向輸入操作符 (<) 與復制操作符 (&) 結合使用,指定的文件必須已經存在。如果輸入文件存在,Cmd.exe 將以只讀方式打開該文件,然后將文件包含的字符作為輸入發(fā)送到此命令(如同從鍵盤輸入一樣)。如果指定了句柄,Cmd.exe 將指定的句柄復制到系統現有的句柄中。
例如,要以句柄 0 輸入讀取(即 STDIN)的方式打開 File.txt,請鍵入:
<file.txt
要打開 File.txt,并在內容排序后將輸出發(fā)送到命令提示符窗口(即 STDOUT),請鍵入:
sort<file.txt
要查找 File.txt,然后將句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,請鍵入:
findfile file.txt>search.txt 2<&1
要以句柄 0 輸入讀?。?STDIN)的方式復制用戶定義的句柄 3,請鍵入:
<&3
返回頁首
使用 & 操作符重定向輸出和復制
如果將輸出重定向到文件且指定了現有的文件名,Cmd.exe 將以只寫方式打開文件并覆蓋該文件內容。如果指定了句柄,Cmd.exe 將文件復制到現有句柄中。
要將用戶定義的句柄 3 復制到句柄 1,請鍵入:
>&3
要將包括句柄 2(即 STDERR)的所有輸出從 ipconfig 命令重定向到句柄 1(即 STDOUT),然后將輸出重定向到 Output.log,請鍵入:
ipconfig.exe>>output.log 2>&1
返回頁首
使用 >> 重定向操作符附加輸出
要從命令中將輸出添加到文件末尾而不丟失文件中已存在的任何信息,請使用兩個連續(xù)的大于號(即 >>)。例如,使用下列命令可以將 dir 命令生成的目錄列表附加到 Dirlist.txt 文件:
dir>>dirlist.txt
要將 netstat 命令的輸出附加到 Tcpinfo.txt 的末尾,請鍵入:
netstat>>tcpinfo.txt
返回頁首
使用管道操作符 (|)
管道操作符 (|) 可以提取一個命令的輸出(默認情況下是 STDOUT),然后將其定向到另一個命令的輸入(默認情況下是 STDIN)中。例如,使用下面的命令可以對目錄進行分類:
dir | sort
在本例中,將同時啟動兩個命令,但隨后 sort 命令會暫停,直到它接收到 dir 命令的輸出為止。sort 命令使用 dir 命令的輸出作為輸入,然后將輸出發(fā)送到句柄 1(即 STDOUT)。
返回頁首
合并帶重定向操作符的命令
通過合并帶有其他命令和文件名的篩選器命令,可以創(chuàng)建自定義命令。例如,可以使用以下命令存儲包含“LOG”字符串的文件名:
dir /b | find "log" loglist.txt
dir 命令的輸出是通過 find 篩選器命令進行發(fā)送的。包含字符串“LOG”的文件名作為文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存儲在文件 Loglist.txt 中。
要在相同命令中使用多個篩選器,請使用管道 (|) 分隔篩選器。例如,下面的命令將搜索 C 盤上的每個目錄以查找包含“LOG”字符串的文件名,并且在命令提示符窗口中每次顯示一屏:
dir c:\ /s /b | find "log" | more
利用管道 (|) 可以對 Cmd.exe 進行定向,使其通過 find 篩選器命令發(fā)送 dir 命令輸出。find 命令只選擇包含字符串“LOG”的文件名。more 命令可以顯示 find 命令選擇的文件名(在命令提示符窗口中每次顯示一屏)。有關篩選器命令的詳細信息,請參閱使用篩選器。
聯系客服