2013-03-15 299 views
9
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=a"') do (set usemenu=a) 
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=b"') do (set usemenu=b) 
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=c"') do (set usemenu=c) 

對,在這段代碼中(這可能行不通,我試圖找出),我們在'for'命令中有這個「%% a」。區別:%% a和%variable%變量之間的區別是什麼?

首先,%變量%和%% a之間有什麼區別?

其次,有人可以向我解釋'for'命令嗎?我有谷歌它的方式太多,所有的解釋似乎很複雜...

我想要做的是從options.txt拉一個變量,所以我可以改變我的遊戲啓動器的菜單樣式。有3種樣式(a,b和c),所以如果options.txt顯示「menu = a」,我怎樣才能讓它設置一個像%usemenu%這樣的變量值?

感謝您提前提供任何幫助!

回答

27

%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,對不對? (對於bc也是如此,你可以嘗試通過循環遍歷文件或輸出的行並使用適當的標記來確定menu的值,但根據行的格式,這可能會非常棘手,請嘗試使用for。你必須在理論上有工作是什麼,那麼你應該簡單地堅持這一點但是,您可以使用它周圍的循環,以避免重複在同一行三次abc

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變量。如果你有很多可能的選擇來支持,這當然更容易維護:-)。

+0

那麼我如何使用這個來解決我的遊戲啓動器問題?我是否正確使用該命令? – magicbennie 2013-03-15 09:50:32

+1

你在那裏:) – Joey 2013-03-15 10:25:47

相關問題