此 FOR 命令的輸出有問題

此 FOR 命令的輸出有問題

我剛剛意識到我正在這個註冊表項的開頭執行一個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:\>

相關內容