批處理之 for /f 中的delims和tokens
0x00 前言
今天在學習關於windows提權之前的系統信息收集的時候,需要使用到一條批處理語句把特定部分的內容從一個txt的文本當中提取出來;該條語句是如下:
for /f "tokens=2,3 delims==" %%a in (tmplist.txt) do (echo %%a >> software.txt)
當時跟著教程操作的時候,對這條語句的了解也只是僅限於知道這條語句的作用是將tmplist.txt文本文件裏面的內容按照一定規則取出想要的部分的內容輸出到software.txt文本裏;
但是跟著教程一路操作下來,到了這一步卻出現了如下的錯誤:
報出的錯誤是此處不應有%%a,按照這個錯誤提示去搜索,也沒有找到一個能解決的答案
反復確認前面的操作也一模一樣過後,到了我這裏卻不對了,這種感覺是很不爽的,所以需要弄明白這條指令的確切使用方法與含義
0x01 對整條語句的分解剖析
1、for /f :用來解析文本,讀取字符串 ,將要讀取的文本就是tmplist.txt。
2、tokens:tokens負責提取字符串。具體用法見實例。
3、delims:根據定義的符號,負責切分字符串,比如delims== 就是根據=號來切分字符串。
4、in 、do :也就是表面的含義吧,在什麽裏面和做什麽
5、(tmplist.txt):要操作的文本文件
6、echo %%a >> software.txt: 將一段內容重定向到software.txt文本中
0x02 示例1
要處理的文本文件名為:tmplist.txt,其內容為:
1、饒天亮=玫瑰愛人.wma
2、高一首=我不願錯過.mp3
3、黃凱芹=傷感的戀人.MP3
4、黃燦=黃玫瑰.lrc
5、黎姿=如此這般的愛情故事.mp3
--顯示文本文件內的全部內容,執行的命令:
for /f %%i in (tmplist.txt) do echo %%i
得到的結果如下:
0x03 示例2
--假如只要序號和歌手名,不要歌曲名和後綴名(默認提取左邊的內容),執行的命令:
for /f "delims==" %%a in (tmplist.txt) do echo %%a
得到的結果如下:
**delims的作用就是設定分割符,"delims=="表示定義等號“=”為分隔符,並用該分隔符“=”切分文本字符串。字符串就是“tmplist.txt”裏的內容,也就是文件裏的文字和標點符號。
0x04 示例4
--假如只要歌手名和歌曲名,不要序號和後綴名,執行的命令如下
for /f "tokens=2 delims=*." %%a in (tmplist.txt) do echo %%a
經過實際的嘗試,發現如果使用中文編碼的符號頓號“、”來作為分割符,是無法正確得到結果的,所以將序號後面的頓號全部改為“*” ,以便測試的正常進行;
1*饒天亮=玫瑰愛人.wma
2*高一首=我不願錯過.mp3
3*黃凱芹=傷感的戀人.MP3
4*黃燦=黃玫瑰.lrc
5*黎姿=如此這般的愛情故事.mp3
得到的結果如下:
**所以用delims定義頓號“*”和點號“.”作為分隔符,將原文分成三部分。
例如:1*饒天亮=玫瑰愛人.wma這一行就被分為以下三部分:
1···················第一部分給定序號為1
饒天亮=玫瑰愛人············第二部分給定序號為2
wma··················第三部分給定序號為3
-------------------------------------------------
tokens的意義就是,提取指定的列。
-------------------------------------------
所以當內容被分為3部分過後,tokens的作用就是根據他們各自的序號來選擇取出那一部分的字符串用來輸出,所以在剛才示例中tokens的值為2,因此表示的就是取出被分割出來的字符串裏面的第二部分內容
所以如果想要取出第2、3部分的話,代碼如下:
for /f "tokens=1,3 delims=*." %%a in (tmplist.txt) do echo %%a %%b
**不知道有沒有發現,當tokens的參數有兩個時,在命令的最後多了一個參數 %%b
“%%a %%b”對應於“token”後面的列數。有多少列就要有多少個輸出變量,並且各變量中的字母存在先後順序。
0x05 關於最開始的報錯:“此處不應有%%a ”的解決辦法
根絕前面的分析,整條命令的用法,以及各個參數的含義已經基本了解,並且根據操作都能正確的執行並得到結果,但是當我還是按照我最後的理解在cmd命令行裏面去執行的時候,依然爆出“此處不應有%%a”的錯誤,最後發現,如果將所有的需要執行的命令都放在.bat的腳本文件裏去執行的話都不會有任何錯誤,但是如果將命令直接放到cmd命令行執行的話,還是不能正確執行;
最後找到的解決辦法就是:如果想要在cmd命令行裏面使for /f "tokens=2,3 delims==" %%a in (tmplist.txt) do (echo %%a >> software.txt)語句生效執行的話,需要將%%a換成%a,就能正確執行了;
0x06 參考鏈接
http://blog.sina.com.cn/s/blog_4b795cc10100ez8d.html
批處理之 for /f 中的delims和tokens