%variable%
是環境變量。它們設置爲set
,可以通過%foo%
或!foo!
訪問(如果啓用,則延遲擴展)。 %%a
是由for
命令創建的特殊變量,用於表示當前循環項目或當前行的標記。
for
可能是關於批處理文件中最複雜和最強大的部分。如果你需要循環,那麼在大多數情況下for
你有覆蓋。 help for
有一個總結。
您可以
- 疊代的文件:
for %x in (*.txt) do ...
- 重複的東西ñ時間:
for /l %x in (1, 1, 15) do...
(參數是開始,步和年底)
- 遍歷一個一組數值:
for %x in (a, b, c) do ...
- 遍歷一個文件的行:
for /f %x in (foo.txt) do ...
- 文件的令牌化線:
for /f "tokens=2,3* delims=," %x in (foo.txt) do ...
- 遍歷一個命令的輸出:
for /f %x in ('somecommand.exe') do ...
這只是一個簡短的概述。它變得更復雜,但請閱讀幫助。
形式%%a
的變量(或%a
如果for
是批處理文件外使用)非常相似參數批處理文件和子程序(%1
,%2
,...)。可以對它們應用某些類型的擴展,例如,如果變量表示帶有可用於路徑的文件名的文件名和擴展名,則可以使用%%~nxa
。這些完整的概述見help for
。
另一方面,環境變量還有其他一些特殊的東西。您可以通過%foo:a=b%
在其中執行替換,結果將爲%foo%
,但每a
被替換爲b
。你也可以採取子字符串:%foo:~4,2%
。這些事情的描述可以在help set
找到。
至於爲什麼%variables%
和%%a
是不同的事情,這有點難以回答,可能只是一個歷史古怪。如上所述,第三種變量%1
等與for
中使用的變量非常相似,並且已經存在更長時間了,我想。由於環境變量由於塊而在for
中使用有點難以處理,因此很大程度上依賴於延遲擴展,所以可能決定使用與參數相同的機制而不是環境變量。
此外,環境變量可能會更昂貴,因爲該進程有一個特殊的「環境」內存塊,它們被存儲在variable=value␀
對中,因此更新環境變量涉及潛在地複製一些內存,而另一種變量可能更輕量級。雖然這是猜測。
至於你的問題,你並不真的需要for
這裏:
find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=a" && set usemenu=a
這將只運行set
如果前面的命令是成功的,即menu=a
被發現。這應該比for
容易得多。從我讀到的你試圖看看menu=a
是否存在於不包含冒號的行中,在這種情況下usemenu
應該設置爲a
,對不對? (對於b
和c
也是如此,你可以嘗試通過循環遍歷文件或輸出的行並使用適當的標記來確定menu
的值,但根據行的格式,這可能會非常棘手,請嘗試使用for
。你必須在理論上有工作是什麼,那麼你應該簡單地堅持這一點但是,您可以使用它周圍的循環,以避免重複在同一行三次a
,b
和c
:
for %%X in (a b c) do (
find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=%%X" && set usemenu=%%X
)
如果文件你解析很簡單,但是,只有name=value
對在每一行: foo
將是一個評論,那麼你可以使用for
還有:
for /f "tokens=1,* eol=: delims==" %%A in (%appdata%\gamelauncher\options.txt) do (
if "%%A"=="menu" set usemenu=%%B
)
但是,這取決於文件的具體格式一點。上面的片段現在將逐行讀取文件,並且每行將放棄冒號(eol=:
選項)後的所有內容,使用等號作爲令牌分隔符並捕獲兩個令牌:第一個=
之前的部分及其後的所有內容。令牌的名稱以%%A
開頭,所以第二個隱含地爲%%B
(同樣,這在help for
中進行了說明)。現在,對於每一行,我們檢查第一個標記並查看它是否爲menu
,如果是,則將其值分配給usemenu
變量。如果你有很多可能的選擇來支持,這當然更容易維護:-)。
那麼我如何使用這個來解決我的遊戲啓動器問題?我是否正確使用該命令? – magicbennie 2013-03-15 09:50:32
你在那裏:) – Joey 2013-03-15 10:25:47