濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Windows cmd命令行輸入輸出重定向問(wèn)題

Windows cmd命令行輸入輸出重定向問(wèn)題

熱門標(biāo)簽:外呼系統(tǒng)解決電銷問(wèn)題 南陽(yáng)高頻外呼系統(tǒng)怎么安裝 高德百度地圖標(biāo)注推廣 菏澤電銷外呼系統(tǒng)軟件 地圖標(biāo)注店鋪的收費(fèi) 為什么申請(qǐng)400電話 京東辦理400電話查詢 蘇丹地圖標(biāo)注app 貴陽(yáng)電話外呼系統(tǒng)廠家

最近學(xué)校的網(wǎng)比較搓,DNS天天掛,出口帶寬天天堵,NAT后的總出口帶寬也才4MB/s(來(lái)源:360測(cè)速),唉,不親身體會(huì)鬼才知道一堆人共享這個(gè)帶寬是什么感覺(jué)。
廢話不多說(shuō)了,在Unix下重定向用著感覺(jué)很high,現(xiàn)在想把win下的nslookup的錯(cuò)誤提示“*** Can't find server name for address 10.3.9.5: Non-existent domain”一同導(dǎo)出到txt文件,搜了下,嗯,遂有此文。
再說(shuō)句廢話,windows這是赤裸裸的抄襲啊,stdio(0),stdout(1),stderr(2)都跟unix是一樣的

重定向符號(hào)主要有:>,>>,,>,和|,以下只有前五個(gè)的介紹,最后一個(gè)是管道,與Unix亦完全一致。

第一節(jié)

首先從一個(gè)經(jīng)典問(wèn)題開(kāi)始,“1>nul 2>nul”的意思是既屏蔽正常的輸出又屏蔽錯(cuò)誤的輸出,那么我們馬上就知道了這里的1表示正常輸出(即所謂的“標(biāo)準(zhǔn)輸出”--stdout),2表示錯(cuò)誤輸出(即所謂的“標(biāo)準(zhǔn)錯(cuò)誤輸出”--stderr)。

1和2其實(shí)是句柄stdout和stderr的數(shù)字代號(hào),至于什么是句柄,我認(rèn)為可以理解為某種事物的一種標(biāo)識(shí),或者說(shuō)這個(gè)句柄指向某個(gè)事物。舉個(gè)例子來(lái)說(shuō),“標(biāo)準(zhǔn)輸出”以句柄stdout為標(biāo)識(shí),或者說(shuō)句柄stdout指向“標(biāo)準(zhǔn)輸出”。
還有一個(gè)句柄--stdin,它是所謂“標(biāo)準(zhǔn)輸入”的標(biāo)識(shí),數(shù)字代號(hào)是0。除此之外還有3~9可用,只是它們沒(méi)有定義。

“標(biāo)準(zhǔn)輸出”和“標(biāo)準(zhǔn)錯(cuò)誤輸出”默認(rèn)是要輸出到控制臺(tái)con(即cmd窗口)的,而“標(biāo)準(zhǔn)輸入”默認(rèn)是由控制臺(tái)con(即鍵盤)輸入的,因此重定向的目的就是將輸入輸出流從默認(rèn)位置重定向到新的位置。符號(hào)“>”和“>>”的默認(rèn)句柄代號(hào)是1,而“”的默認(rèn)句柄代號(hào)是0。

“echo hhhhhh”類似于這樣的語(yǔ)句可以說(shuō)是我們?cè)偈煜げ贿^(guò)的了,但這只是種默認(rèn)的狀態(tài),其實(shí)里面還有一些內(nèi)容。這一句完整的應(yīng)該是這樣的:“echo hhhhhh 1>con 2>con”,意思是將echo命令的結(jié)果中的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出輸出到控制臺(tái)con中,只不過(guò)此時(shí)標(biāo)準(zhǔn)錯(cuò)誤輸出是空的。

再看一個(gè)例子,如果給dir一個(gè)錯(cuò)誤的參數(shù),例如“dir /mm”,那么寫(xiě)全了就是“dir /mm 1>con 2>con”,只不過(guò)此時(shí)的標(biāo)準(zhǔn)輸出是空的。如果你這樣寫(xiě)的話“dir /mm 1>hero.txt”,那么屏幕上會(huì)照常顯示錯(cuò)誤信息但hero.txt中不會(huì)有內(nèi)容。

再來(lái)一個(gè)標(biāo)準(zhǔn)輸入的例子,“set /p var= ”其實(shí)應(yīng)該是這樣的“set /p var= 0con”,只是因?yàn)?con是默認(rèn)值可以省略。我們當(dāng)然可以從文件中讀取輸入,如“set /p var= 0file.txt”,0是默認(rèn)值可以省略。

nul代表的是“空設(shè)備”,是一個(gè)不存在的設(shè)備,將輸出流重定向到空設(shè)備就相當(dāng)于屏蔽掉了一樣。而如果從空設(shè)備中讀取輸入,自然是讀不到東西的,但的確是輸入了,這也就是“set /p var=nul”中“nul”相當(dāng)于回車但不換行的原因。

第二節(jié)

下面要講的是句柄代碼之間的“重定向”。 之前不是提到過(guò)還有3~9這7個(gè)句柄數(shù)字代號(hào)嗎,這些究竟有什么用?說(shuō)實(shí)話,基本沒(méi)什么用,因此建議你如果不是迫切想知道這部分內(nèi)容的話就不要往下看了。

“echo hero 1>hero.txt”這一句是將標(biāo)準(zhǔn)輸出重定向到文件hero.txt,相當(dāng)于將句柄代號(hào)1的指向由con變?yōu)閔ero.txt。“echo hero 3>hero.txt 13”,這句的結(jié)果是生成了文件hero.txt,其內(nèi)容為hero,過(guò)程是這樣的:“3>hero.txt”是將句柄數(shù)字代號(hào) 3的指向由“空”變?yōu)閔ero.txt;“13”是將句柄數(shù)字代號(hào)3的指向復(fù)制給1的指向,此時(shí)1的指向就為hero.txt了,因此標(biāo)準(zhǔn)輸出就被重定向到hero.txt中了。

“ij”和“i>j”的效果都是把j的指向復(fù)制給i。“echo hero >hero.txt 2>1”這句的意思是,無(wú)論是標(biāo)準(zhǔn)輸出還是標(biāo)準(zhǔn)錯(cuò)誤輸出都會(huì)被重定向到hero.txt中,具體過(guò)程:1的指向由con轉(zhuǎn)為 hero.txt,“2>1”是把1的指向復(fù)制給2,此時(shí)2的指向也變?yōu)榱薶ero.txt,因此1和2都會(huì)被重定向到hero.txt 中。注意:1是符號(hào)“>”的默認(rèn)句柄數(shù)字代號(hào)。

再看“echo hero 3>hero.txt”,這個(gè)為什么就不能將結(jié)果重定向到文件中呢?記住,我們要重定向的只有標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,因此真正“干活” 的就只有0、1和2,因?yàn)樗鼈兎謩e指代了前面的三者,而3沒(méi)有指代任何句柄只能作為間接量使用。

“more 3hero.txt 0>3”這句是顯示文件hero.txt,具體過(guò)程:“3hero.txt”把3的指向變?yōu)?hero.txt,“0>3”把3的指向復(fù)制給0,即0指向了hero.txt(只不過(guò)這次是從hero.txt中讀取數(shù)據(jù))。強(qiáng)調(diào)一下,真正能讀取數(shù)據(jù)的是0而不是3,3只是作為中間量而已。剛才這句我們當(dāng)然可以這么寫(xiě):“more 0hero.txt”或直接“more hero.txt”。

再來(lái)一個(gè)例子“echo hero 5>hero.txt 4>5 34 13”,結(jié)果輸出到了hero.txt中。具體過(guò)程:5的指向變成hero.txt,“4>5”把5的指向復(fù)制給 4,“3>4”把4的指向復(fù)制給3,“1>3”把3的指向復(fù)制給1,最終1的指向就是hero.txt,則1所指代的標(biāo)準(zhǔn)輸出就被重定向到了hero.txt。

第三節(jié)

注意:這一節(jié)的內(nèi)容都是圍繞著下面這個(gè)例子進(jìn)行敘述的。

代碼:

@echo off
echo 英雄是好男人?。。?
echo 1>nul 3>nul
echo 英雄是
echo 英雄是
echo 這是怎么回事,難道就不能 1>con 4>con
pause

這究竟是怎么回事?為什么結(jié)果會(huì)如此出乎意料?
這里涉及到一個(gè)所謂“備份”的問(wèn)題,就是在修改某個(gè)句柄代號(hào)的指向之前,系統(tǒng)會(huì)把該句柄代號(hào)原來(lái)的指向備份到截止到目前第一個(gè)指向?yàn)榭盏木浔?hào)中。目的是當(dāng)這一行的程序結(jié)束之后,系統(tǒng)可以通過(guò)備份找回原來(lái)的指向。

( 在繼續(xù)閱讀之前建議你準(zhǔn)備好紙筆,以便能記錄下各個(gè)代號(hào)指向的變化,這樣不至于混亂)
我們現(xiàn)在把焦點(diǎn)集中到這句“echo. 1>nul 3>nul”上來(lái)。這句究竟是如何工作的呢?

第一步:在運(yùn)行“1>nul”之前,1的指向是默認(rèn)值con,此時(shí)代號(hào)3~9的指向都是空(初始值),因此系統(tǒng)會(huì)把1的指向備份到3(因?yàn)?是第一個(gè)為空的代號(hào)),3就指向了con。就是說(shuō)系統(tǒng)把1原來(lái)的指向復(fù)制給了3,目的是語(yǔ)句結(jié)束后能找回原來(lái)的指向,這就相當(dāng)于備份。

第二步:現(xiàn)在3的指向是con。然而由于要運(yùn)行“3>nul”,因此還要備份3的指向。此時(shí)4是空的,系統(tǒng)就把3的指向con復(fù)制給了4,即4現(xiàn)在指向con。就是說(shuō)3以4為備份。

第三步:由于“3>nul”使得3指向了nul。

第四步:這行語(yǔ)句結(jié)束時(shí),1要找回原來(lái)的指向,從以上敘述我們知道,3是1的備份,因此1要通過(guò)3來(lái)恢復(fù)“原來(lái)”的指向,但此時(shí)3的指向已經(jīng)變?yōu)榱薾ul,故1就指向nul。

第五步:而3要恢復(fù)原來(lái)的指向就要找4,4指向con,故3恢復(fù)為con;4原始指向是空的,其備份在5中,故4的指向恢復(fù)到空。

至此我們理順一下,現(xiàn)在1指向nul,2指向默認(rèn)值con,3指向con,4之后都是空指向。那么在運(yùn)行后兩句echo語(yǔ)句時(shí)由于1指向nul,即標(biāo)準(zhǔn)輸出被重定向到空設(shè)備,故顯示被屏蔽。

再來(lái)看看這句 “echo 這是怎么回事,難道就不能 1>con 4>con” 這句是怎么工作的呢?

第一步:1當(dāng)前指向是nul,由于要運(yùn)行“1>con”,因此要進(jìn)行備份。但此時(shí)3指向的是con非空,故系統(tǒng)將1的指向備份到4,即4指向nul。

第二步:又由于要運(yùn)行“4>con”,故4現(xiàn)在的指向nul就又被備份到5中,5以后的事姑且省略。
第三步:運(yùn)行完“4>con”之后4就指向con。
第四步:該行程序結(jié)束后,1要通過(guò)4來(lái)恢復(fù)指向。4指向con,故1指向con從而恢復(fù)了默認(rèn)狀態(tài)。而4找5,5指向nul,故4指向nul。
我們?cè)贁?shù)一數(shù)現(xiàn)在的情況,0指向con,1指向con,2指向con,3沒(méi)動(dòng)還是指向con,4指向nul,5以后都為空指向。
會(huì)不會(huì)有點(diǎn)亂?那就再好好的看幾遍吧,或者是看看這篇,講的更基礎(chǔ)一些:

第四節(jié)
我們已經(jīng)知道“echo hero”相當(dāng)于“echo hero 1>con 2>con”,con表示控制臺(tái),可以把con看做是特殊的文件,這就是我們無(wú)法建立名為con文件的原因。

再對(duì)“>”和“>>”的重定向機(jī)制做個(gè)分析。當(dāng)要重定向到的文件有隱藏或系統(tǒng)屬性時(shí),“>>”可以正常運(yùn)行,而 “>”就無(wú)法操作了。據(jù)此我推測(cè),對(duì)于“>”的重定向輸出,如果文件不存在當(dāng)然是建立文件,而如果文件存在就先將文件刪除,然后再新建文件,也就是說(shuō)并非是覆蓋文件的內(nèi)容而是先刪除文件再建立新文件。

通過(guò)第三節(jié)的講解你應(yīng)該明白為什么類似這樣的語(yǔ)句“echo hero >nul >con >hero.txt >con”會(huì)以最后一個(gè)為準(zhǔn)了吧。

最后需要注意一點(diǎn)的是--重定向輸出無(wú)法輸出到只讀文件。

完。
WIN下的大部分重定向與Unix還是一致的,嗯

下面是補(bǔ)充

Windows下cmd標(biāo)準(zhǔn)輸入輸出重定向

Command 功能
command > filename 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中
command >> filename 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加)
command 1 > fielname 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中
command > filename 2>1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件
command 2 > filename 把標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件中
command 2 >> filename 把標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件中(追加)
command >> filename 2>1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中(追加)
command filename1 > filename2 command命令以filename1文件作為標(biāo)準(zhǔn)輸入,以filename2文件作為標(biāo)準(zhǔn)輸出
command filename command命令以filename文件作為標(biāo)準(zhǔn)輸入
command delimiter 從標(biāo)準(zhǔn)輸入中讀入,直至遇到delimiter分界符
command m 將文件描述符m作為標(biāo)準(zhǔn)輸入
command > m 將標(biāo)準(zhǔn)輸出重定向到文件描述符m中
command - 關(guān)閉標(biāo)準(zhǔn)輸入

以上就是Windows cmd命令行輸入輸出重定向問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于cmd命令行輸入輸出重定向的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Windows下通過(guò)cmd進(jìn)入DOS窗口訪問(wèn)MySQL數(shù)據(jù)庫(kù)
  • Windows CMD命令大全(值得收藏)
  • 復(fù)制 Windows cmd 窗口命令行的信息方法
  • Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法
  • java執(zhí)行windows下cmd命令的方法
  • PHP啟動(dòng)windows應(yīng)用程序、執(zhí)行bat批處理、執(zhí)行cmd命令的方法(exec、system函數(shù)詳解)
  • Windows Powershell 命令集 cmdlets
  • Windows運(yùn)行bat批處理文件時(shí)隱藏cmd命令提示符窗口的方法
  • WindowsXP系統(tǒng) CMD常用命令大全

標(biāo)簽:阿里 通遼 資陽(yáng) 咸寧 滄州 海北 昌都 韶關(guān)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Windows cmd命令行輸入輸出重定向問(wèn)題》,本文關(guān)鍵詞  Windows,cmd,命令行,輸入,輸出,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Windows cmd命令行輸入輸出重定向問(wèn)題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Windows cmd命令行輸入輸出重定向問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    聂拉木县| 山丹县| 平远县| 五寨县| 河津市| 科尔| 星座| 长治县| 同心县| 马尔康县| 巴青县| 凤庆县| 扎赉特旗| 凌源市| 同心县| 自贡市| 佳木斯市| 秦皇岛市| 敦煌市| 闵行区| 湘阴县| 如皋市| 威远县| 贵定县| 芒康县| 酒泉市| 宽甸| 乌兰县| 崇左市| 太仓市| 阳原县| 威宁| 三门峡市| 黔江区| 高要市| 丰都县| 吉水县| 平乡县| 三门峡市| 沂源县| 大姚县|