
我剛剛意識到我正在這個註冊表項的開頭執行一個bat文件,其中有echo running abc
一些其他不相關的東西
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
所以在這裡我修改了該bat檔..它只是一行,沒有任何不相關的內容。
你會看到bat檔案的內容。
這是 cmd 提示字元的一些輸出,顯示了現在的情況,這是相同的基本問題,但您應該能夠重現問題
現在的問題是,
- 為什麼它說 echo sss 而不是 echo sss ttt?
- 如何使用 FOR 抑制 cmd 或初始化 bat 檔案的運作? FOR 語句實際上應該只顯示“echo g”,而不是“echo sss”或“echo sss ttt”。
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\
C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt
C:\>
C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>
C:\>echo sss
sss
C:\>echo g
g
C:\>
答案1
為什麼它說 echo sss 而不是 echo sss ttt?
因為該行sss ttt
包含空格字元。該for
命令對其進行標記並將前半部分儲存在變數sss
中%f
,後半部分儲存ttt
在%g
變數中。
如何使用 FOR 抑制 cmd 或初始化 bat 檔案的運作? FOR 語句實際上應該只顯示“echo g”,而不是“echo sss”或“echo sss ttt”。
似乎為了評估echo g ^| findstr "g"
一個新的命令解釋器被初始化並\blah\startfile.bat
自動執行。讓你的批次不輸出任何東西。
答案2
如果要%f
在批次檔中使用,則需要用另一個轉義它%
:
for /f %%f in ('echo g ^| findstr "g"') do echo %%f
將其放入批次檔中,您應該會得到您正在尋找的結果。
答案3
只是為了擴展一下 Vlastimil 的答案...
當。FOR
命令執行"echo g"
並將輸出傳送到findstr
,為了必須先啟動一個新的命令處理器,這會導致\blah\startfile.bat
被處決。
\等等\startfile.bat輸出一行包含sss ttt
。該行的處理方式是為了並且是不是傳遞給查找字串。
根據幫助為了:
處理包括...,將其分解為單獨的文字行,然後將每行解析為零個或多個標記。然後呼叫 for 迴圈的主體,並將變數值設定為找到的標記字串。預設情況下,/F 傳遞每行的第一個空格分隔的標記...
預設分隔符號為為了是:“,;”(空格逗號和分號)。
第一行是為了行程包含字串:SS TT。該字串包含一個" "
(空格),這是預設分隔符為了,它解析該行並分配第一個標記字串:“咩咩”到“%F”。所以“迴聲%f”輸出一行僅:“咩咩”。這是您看到列印的第一行。這“TT”被簡單地丟棄,因為“對於...回顯%f”命令未指定包含除第一個標記以外的任何內容。
如果為了命令的寫法不同,您會看到整行“sss tt”迴聲。
這裡有3種方法為了可以編寫命令來執行此操作。
第一種方式,使用"delims="
選項,設定分隔符為了到“空”,所以為了將整行傳回為 1 個標記。標記仍然被解析,並且所有分隔符號 (“,;”) 被刪除,然後所有標記再次組合,每個標記之間有一個空格。該組合值會傳回變數中“%F”
C:\>for /f "delims=" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\>echo mm nn oo ss tt
mm nn oo ss tt
接下來的方式,使用"tokens=*"
選項,告訴為了將找到的所有標記放入指定變數的值中(“%F”)。仍然會解析標記,並刪除所有分隔符,然後再次將所有標記組合在一起,每個標記之間有一個空格。
C:\>for /f "tokens=*" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt
第三種方式,使用"tokens=1,*"
選項,告訴為了將找到的第一個 (1) 標記放入指定變數的值中 (“%F”)。並且,解析剩餘的標記,並刪除所有分隔符,然後將所有剩餘的標記再次組合在一起,每個標記之間有一個空格,並將該組合值返回到以指定變數名稱後面的字母命名的變數中(因此在這種情況下,變數“%G”)。
C:\>for /f "tokens=1,*" %f in ('echo sss ttt') do echo %f %g
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"
C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"
請注意,以下內容將不起作用,因為沒有為超出指定變數的變數定義“tokens=”“%F”:
C:\>for /f %f in ('echo sss ttt') do echo %f %g
C:\>echo sss %g
sss %g
因此,在您的範例中,如果您添加了"delims="
選項,你會看到這個:
C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f
C:\>echo sss ttt
sss ttt
C:\>echo g
g
C:\>