免费体验120秒视频_榴莲榴莲榴莲榴莲官网_2021国产麻豆剧果冻传媒入口_一二三四视频社区在线
當前位置: 首頁IT技術 → 批處理(bat)利用set p與重定向輸入分行獲取文本內容

批處理(bat)利用set p與重定向輸入分行獲取文本內容

更多

起因是前幾天的某個帖子中看到 cmd<1.txt 的用法,原以為1.txt 中的 pause 之所以被跳過是因為執行完后馬上接收到了一個回車符,于是我把1.txt 中的所有 pause 都改成 pause&rem ,并去除所有回車符進行試驗,下為去除回車符的代碼:

 

1.  

@echo off&setlocal enabledelayedexpansion

2.  

set hh=^

3.   
4.   
5.  

::獲取換行符

6.  

for %%a in (

7.  

        "@echo off" "pause&rem" "echo abc" "pause&rem"

8.  

) do set str=!str!!hh!%%~a

9.  

echo !str:~2!>3.txt

10.      

::只用換行符斷行

11.      

cmd<3.txt

12.      

echo;

13.      

echo ________end________

14.      

Pause

 

假設修改后 1.txt內容如下(測試時,此文本中不存在回車符):

 

1.  

@echo off

2.  

pause&rem

3.  

echo abc

4.  

pause&rem

 

結果仍然沒有等待用戶輸入,并且還吞掉了下一行 echo 的第一個字符,導致 cmd 顯示:

 

1.  

        請按任意鍵繼續. . .

2.  

        'cho' 不是內部或外部命令,也不是可運行的程序

3.  

        或批處理文件。

4.  

        請按任意鍵繼續. . .

 

對此感到非常疑惑,百思不得其解之下去請教寒夜版主,他問我 pause 等待的是什么輸入,我才忽然醒悟,原來 pause 等待的是“任意鍵”,也就是說,它把 echo 的 e 當作用戶輸入給接收了(因為行末的 0D 0A被 cmd 接收了,所以 pause 接收的第一個字符就是下一行的首字符 e),因此這里用 pause 無法實現暫停的效果,這就推翻了我原來的認識,證明等待用戶輸入的命令并不是以回車符作為終止輸入的信號。

 

進一步思考一下,眾所周知, set /p 首行=<1.txt 能獲取 1.txt 第一行,那么對含有大量 set /p 的語塊進行重定向,又是什么結果呢?

 

1.  

@echo off

2.  

(for /l %%a in (1 1 10) do set /p .%%a=)<%0

3.  

set.

4.  

pause

 

可以看到,通過 set /p 配合重定向,能夠把文本每一行都設為變量值,這是全新的技巧,更重要的是,這是一種全新的遍歷文本的方式,它相當于不跳過空行的 for until ,這與 for /f 的skip 參數相映成趣,而且還對特殊字符有極佳的兼容性。不過有得必有失,使用 set /p 賦值時,變量長度不能超過 1024 字節,所以局限了這個技巧的適用范圍。

 

激動之余,又產生了兩個疑惑:

1、set /p 是以什么為依據斷行

2、當循環數大于文本行數時,為什么沒有停頓下來等待用戶輸入

 

和寒夜版主一起做了幾個試驗,證明無論是單純的 0D 回車符或者 0A 換行符都無法實現平時在 cmd 窗口中敲回車結束 set /p 輸入的效果,必須出現連續的一組 0D 0A 才能夠終止對一個 set /p 的輸入。關于終止 set /p 輸入的“特征碼”,25 樓的 mxxcgzxxx 提出了更合理的猜想:0D 0A 和 0A 0D 這兩種組合都能起到終止 set /p 輸入的作用。

(25樓鏈接:

http://bbs.bathome.net/viewthread.php?tid=13327&page=2&fromuid=30406#pid86638)

 

而第二個問題,繞了半天彎子終于得到一個比較合理的猜測:當重定向的輸入被前面執行的命令取用完的時候,剩下的就是從空設備的輸入,也就是 set /p .5=

 

1.   

(set /p .a=

2.   

set /p .b=)<只有一行的文件.txt

3.   

set.[/code]其作用相當于:[code]set /p .a=<只有一行的文件.txt

4.   

::取首行

5.   

set /p .b=<nul

6.   

::從空設備獲取輸入,等于無輸入

7.   

set.

8.   

::顯示以.開頭的變量

 

通過這個猜測和其他一些命令接收重定向輸入時表現出的特性衍生出一個推測,那就是 cmd 在接受重定向輸入到命令的時候,也許是一個字符一個字符順序傳遞給語塊\語句的,那些能夠接受重定向輸入的命令會自發地從中獲取輸入,直到命令自行關閉輸入句柄為止。

 

這可以理解為cmd中出現重定向輸入的時候,輸入中的字符在排隊等候被命令依次提走,一直到無字符可提的時候,重定向輸入的來源就成為了一個空設備 nul。

 

好比一個旅行團在打車,出現愿意載客的出租車時,隊伍就有序地依次上車,一輛車客滿后就再等下一輛(旅行團并不知道當前這輛車何時客滿,他們只需要機械地讓排頭的人上車、直到司機喊停為止),最終所有人都打車走光,這時候新來的出租車就找不到客人了,所以空車離開時當然還是空車。

 

當然有些命令是以任意合法字符或者固定字符來判定何時結束輸入的,比如choice、set /p和pause,這就很有利用的價值。

 

此處僅以 set /p 舉幾個例子:

 

1.   

@echo off

2.   

set /p line=要獲取的行所在行數:

3.   

(for /l %%a in (1 1 %line%) do set /p 內容=)<a.txt

4.   

set 內容

5.   

::獲取指定行內容的新方法,由于無需遍歷整個文本,要獲取的行位置靠前的情況下有很大優勢

 

1.    

@echo off

2.    

(for /l %%a in (1 1 100) do set /p .%%a=)<%0

3.     
4.    

::不跳過空行賦值,但是 tmplinshi 版主的測試結果標明這中方法比常規辦法稍慢,它只在某些場合有優勢。

(5樓鏈接:

http://bbs.bathome.net/viewthread.php?tid=13327&page=1&fromuid=30406#pid86516)

 

1.    

@echo off&setlocal enabledelayedexpansion

2.     
3.    

(for /l %%a in (1 1 5) do (

4.    

    if not defined .!n! set /a n+=1

5.    

    set /p .!n!=

6.    

))<%0

7.    

::當然也同樣可以跳過空行只將前N行賦值

8.     
9.    

@echo off

10.      

(for /l %%a in (1 1 7) do (

11.      

    pause

12.      

    set /p echo=

13.      

    echo !echo!

14.      

)<%0

15.      

::去除每行行首第一個任意字符的另一種方法,如果不計較效率的話,用choice可以去除指定字符

 

1.     

@echo off

2.     

(for /l %%a in (1 2 7) do (

3.     

    set /a a=1,b=2

4.     

    set /p a=

5.     

    set /p b=

6.     

    if !a!==!b! echo 相等

7.     

)<%0

8.     

::以兩行為周期判斷其內容是否相等,這比起老方法省下了許多麻煩,比如無需用 setlocal、endlocal 來兼容特殊字符

 

1.     

@echo off

2.     

(for %%a in (

3.     

1-關回顯 2-for循環 3-循環內容 4-do 4-設變量 5-輸入 6-查看變量 7-注釋

4.     

) do (

5.     

    set /p .%%a=

6.     

))<%0

7.     

set.

8.     

::可以通過無參數的for來循環,實現了以往無法實現的效果

9.      
10. 

@echo off&setlocal enabledelayedexpansion

11. 

(for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do (

12. 

    set t2=

13. 

    set /p t2=

14. 

    echo;%%b!t2!

15. 

))<2.txt>合并.txt

16. 

::由于可以有兩個不同的輸入來源并存,所以雙文本乃至多文本合并就成為輕而易舉的事了

 

無奈的是,可以分段接受重定向輸入的命令寥寥無幾,所以暫時還沒有想到更多的實用技巧,還是等待大家來補充吧。

 

感謝寒夜孤星、mxxcgzxxx、tmplinshi給予指點和共同探討、測試。

熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
免费体验120秒视频_榴莲榴莲榴莲榴莲官网_2021国产麻豆剧果冻传媒入口_一二三四视频社区在线
主站蜘蛛池模板: 亚洲精彩视频在线观看| 国产真实乱了全集磁力| 天天拍天天干天天操| 色视频在线观看视频| 天天爱夜夜做| 果冻传媒第一第二第三集| 2017狠狠干| 亚洲精品无码高潮喷水在线| 亚洲中文字幕无码一久久区| 国产成人一区二区三区视频免费| 老少交欧美另类| 天天天综合网| 国产精品一区二区久久精品涩爱| 国产成人精品福利色多多| 国产私拍在线| 国产一区二区三区免费在线视频| 欧美国产影院| 国内精品在线播放| 国产亚洲欧美一区二区三区| 国产综合激情在线亚洲第一页| 欧美黑人巨大videos在线| 久久99国产这里有精品视| 亚洲人成伊人成综合网久久久| 久视频在线| 色噜噜狠狠色综合日日| 国产精品一国产精品| 又黄又爽又色的视频在线看| 精品国产青草久久久久福利| 亚洲精品亚洲人成在线观看| 国产成人精品一区二三区在线观看 | 国产精品天天干| 亚洲欧美日韩高清在线看| 中国一级大片| 一边摸一边揉一边做视频| 性中国自由xxxxx孕妇| 91精品欧美综合在线观看| 国产无套粉嫩白浆| 韩国视频一区| 亚洲1区1区3区4区产品乱码芒果 | 人夫的堕落变装| 一级特黄录像视频免费|