windwos 批处理重定向, 讲的策彻底
生活随笔
收集整理的這篇文章主要介紹了
windwos 批处理重定向, 讲的策彻底
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?本帖主要參考了《命令行參考》和一些前輩的文獻,并加入了我自己的一些理解,希望能對各位有所幫助。
《命令行參考》中對重定向操作符有所論述,不過實在晦澀難懂,并且還有些錯誤,不利于大家理解。 重定向的簡單用法相信大家都會,本帖的主要目的就是進一步研究一下重定向。 重定向符號主要有:>,>>,<,>&,<&和|,而本帖中只討論前五個。 第一節(jié) 首先從一個經(jīng)典問題開始,“1>nul 2>nul”的意思是既屏蔽正常的輸出又屏蔽錯誤的輸出,那么我們馬上就知道了這里的1代表正常輸出(即所謂的“標準輸出”--stdout),2代表錯誤輸出(即所謂的“標準錯誤輸出”--stderr)。 1和2其實是句柄stdout和stderr的數(shù)字代號,至于什么是句柄,我認為可以理解為某種事物的一種標識,或者說這個句柄指向某個事物。舉個例子來說,“標準輸出”以句柄stdout為標識,或者說句柄stdout指向“標準輸出”。 還有一個句柄--stdin,它是所謂“標準輸入”的標識,數(shù)字代號是0。除此之外還有3~9可用,只是它們沒有定義。 “標準輸出”和“標準錯誤輸出”默認是要輸出到控制臺con(即cmd窗口)的,而“標準輸入”默認是由控制臺con(即鍵盤)輸入的,因此重定向的目的就是將輸入輸出流從默認位置重定向到新的位置。符號“>”和“>>”的默認句柄代號是1,而“<”的默認句柄代號是0。 “echo hhhhhh”類似于這樣的語句可以說是我們再熟悉不過的了,但這只是種默認的狀態(tài),其實里面還有一些內容。這一句完整的應該是這樣的:“echo hhhhhh 1>con 2>con”,意思是將echo命令的結果中的標準輸出和標準錯誤輸出輸出到控制臺con中,只不過此時標準錯誤輸出是空的。 再看一個例子,如果給dir一個錯誤的參數(shù),例如“dir /mm”,那么寫全了就是“dir /mm 1>con 2>con”,只不過此時的標準輸出是空的。如果你這樣寫的話“dir /mm 1>hero.txt”,那么屏幕上會照常顯示錯誤信息但hero.txt中不會有內容。 再來一個標準輸入的例子,“set /p var= ”其實應該是這樣的“set /p var= 0<con”,只是因為0<con是默認值可以省略。我們當然可以從文件中讀取輸入,如“set /p var= 0<file.txt”,0是默認值可以省略。 nul代表的是“空設備”,是一個不存在的設備,將輸出流重定向到空設備就相當于屏蔽掉了一樣。而如果從空設備中讀取輸入,自然是讀不到東西的,但的確是輸入了,這也就是“set /p var=<nul”中“<nul”相當于回車但不換行的原因。 第二節(jié) 好了,說到這里,相信大家對重定向輸出和輸入又有了進一步的了解,關于重定向輸出到文件和由文件重定向輸入的問題在此也不再復述。我下面要講的是句柄代碼之間的“重定向”。 之前不是提到過還有3~9這7個句柄數(shù)字代號嗎,這些究竟有什么用?說實話,基本沒什么用,因此建議你如果不是迫切想知道這部分內容的話就不要往下看了。 “echo hero 1>hero.txt”這一句是將標準輸出重定向到文件hero.txt,相當于將句柄代號1的指向由con變?yōu)閔ero.txt。“echo hero 3>hero.txt 1<&3”,這句的結果是生成了文件hero.txt,其內容為hero,過程是這樣的:“3>hero.txt”是將句柄數(shù)字代號3的指向由“空”變?yōu)閔ero.txt;“1<&3”是將句柄數(shù)字代號3的指向復制給1的指向,此時1的指向就為hero.txt了,因此標準輸出就被重定向到hero.txt中了。(說到這里,是不是覺得有點像指針呀。) “i<&j”和“i>&j”的效果都是把j的指向復制給i。“echo hero >hero.txt 2>&1”這句的意思是,無論是標準輸出還是標準錯誤輸出都會被重定向到hero.txt中,具體過程:1的指向由con轉為hero.txt,“2>&1”是把1的指向復制給2,此時2的指向也變?yōu)榱薶ero.txt,因此1和2都會被重定向到hero.txt中。注意:1是符號“>”的默認句柄數(shù)字代號。 再看“echo hero 3>hero.txt”,這個為什么就不能將結果重定向到文件中呢?記住,我們要重定向的只有標準輸入、標準輸出和標準錯誤輸出,因此真正“干活”的就只有0、1和2,因為它們分別指代了前面的三者,而3沒有指代任何句柄只能作為間接量使用。 “more 3<hero.txt 0>&3”這句是顯示文件hero.txt,具體過程:“3<hero.txt”把3的指向變?yōu)閔ero.txt,“0>&3”把3的指向復制給0,即0指向了hero.txt(只不過這次是從hero.txt中讀取數(shù)據(jù))。強調一下,真正能讀取數(shù)據(jù)的是0而不是3,3只是作為中間量而已。剛才這句我們當然可以這么寫:“more 0<hero.txt”或直接“more <hero.txt”。 再來一個例子“echo hero 5>hero.txt 4>&5 3<&4 1<&3”,結果輸出到了hero.txt中。具體過程:5的指向變成hero.txt,“4>&5”把5的指向復制給4,“3>&4”把4的指向復制給3,“1>&3”把3的指向復制給1,最終1的指向就是hero.txt,則1所指代的標準輸出就被重定向到了hero.txt。 第三節(jié) 注意:這一節(jié)的內容都是圍繞著下面這個例子進行敘述的。 復制內容到剪貼板 代碼: @echo off echo 英雄是好男人!!! echo. 1>nul 3>nul echo 英雄是白癡!!! echo 英雄是×××!!! echo 這是怎么回事,難道就不能罵罵英雄嗎??? 1>con 4>con pause 這究竟是怎么回事?為什么結果會如此出乎意料? 這里涉及到一個所謂“備份”的問題,就是在修改某個句柄代號的指向之前,系統(tǒng)會把該句柄代號原來的指向備份到截止到目前第一個指向為空的句柄代號中。目的是當這一行的程序結束之后,系統(tǒng)可以通過備份找回原來的指向。 在繼續(xù)閱讀之前建議你準備好紙筆,以便能記錄下各個代號指向的變化,這樣不至于混亂。 我們現(xiàn)在把焦點集中到這句“echo. 1>nul 3>nul”上來。這句究竟是如何工作的呢? 第一步:在運行“1>nul”之前,1的指向是默認值con,此時代號3~9的指向都是空(初始值),因此系統(tǒng)會把1的指向備份到3(因為3是第一個為空的代號),3就指向了con。就是說系統(tǒng)把1原來的指向復制給了3,目的是語句結束后能找回原來的指向,這就相當于備份。 第二步:現(xiàn)在3的指向是con。然而由于要運行“3>nul”,因此還要備份3的指向。此時4是空的,系統(tǒng)就把3的指向con復制給了4,即4現(xiàn)在指向con。就是說3以4為備份。 第三步:由于“3>nul”使得3指向了nul。 第四步:這行語句結束時,1要找回原來的指向,從以上敘述我們知道,3是1的備份,因此1要通過3來恢復“原來”的指向,但此時3的指向已經(jīng)變?yōu)榱薾ul,故1就指向nul。 第五步:而3要恢復原來的指向就要找4,4指向con,故3恢復為con;4原始指向是空的,其備份在5中,故4的指向恢復到空。 至此我們理順一下,現(xiàn)在1指向nul,2指向默認值con,3指向con,4之后都是空指向。那么在運行后兩句echo語句時由于1指向nul,即標準輸出被重定向到空設備,故顯示被屏蔽。 再來看看這句 “echo 這是怎么回事,難道就不能罵罵英雄嗎??? 1>con 4>con” 這句是怎么工作的呢? 第一步:1當前指向是nul,由于要運行“1>con”,因此要進行備份。但此時3指向的是con非空,故系統(tǒng)將1的指向備份到4,即4指向nul。 第二步:又由于要運行“4>con”,故4現(xiàn)在的指向nul就又被備份到5中,5以后的事姑且省略。 第三步:運行完“4>con”之后4就指向con。 第四步:該行程序結束后,1要通過4來恢復指向。4指向con,故1指向con從而恢復了默認狀態(tài)。而4找5,5指向nul,故4指向nul。 我們再數(shù)一數(shù)現(xiàn)在的情況,0指向con,1指向con,2指向con,3沒動還是指向con,4指向nul,5以后都為空指向。 會不會有點亂?那就再好好的看幾遍吧,我也實在沒有什么好辦法了。 第四節(jié) 我們已經(jīng)知道“echo hero”相當于“echo hero 1>con 2>con”,con代表了控制臺,可以把con看做是特殊的文件,這就是我們無法建立名為con文件的原因。 再對“>”和“>>”的重定向機制做個分析。當要重定向到的文件有隱藏或系統(tǒng)屬性時,“>>”可以正常運行,而“>”就無法操作了。據(jù)此我推測,對于“>”的重定向輸出,如果文件不存在當然是建立文件,而如果文件存在就先將文件刪除,然后再新建文件,也就是說并非是覆蓋文件的內容而是先刪除文件再建立新文件。 通過第三節(jié)的講解你應該明白為什么類似這樣的語句“echo hero >nul >con >hero.txt >con”會以最后一個為準了吧。 最后需要注意一點的是--重定向輸出無法輸出到只讀文件。轉載于:https://blog.51cto.com/hyperichq/604458
總結
以上是生活随笔為你收集整理的windwos 批处理重定向, 讲的策彻底的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nw.js FrameLess Wind
- 下一篇: Oracle可视化工具plsqldev8