2012-07-31 61 views
0

我有以下代碼:批量獲取變量的值

for /f "tokens=*" %%p in (input.txt) do (
echo %%p 
cd %%p 
set /a c = 0 
for %%f in (*) do (
echo %%f 
if not exist *test*.* (
set /a c += 1 
) 
) 
if %%c GTR 0 echo %%p >>folders.txt 
cd .. 
) 

但最後的if語句不工作。我想知道我必須做什麼才能訪問我在第一個for設置的變量c。我已經嘗試過不同的組合!或%c%,但似乎沒有任何工作。我錯過了什麼?

回答

1

您在這裏有幾個問題:

  1. 不能有空格必須圍繞=set

    set c=0 
    set /a c+=1 
    

    否則你要創建一個變量,其名稱在空白結束。

  2. 不能在一個塊中設置變量,並在同一個塊中再次使用它們而不使用延遲擴展。因此,你需要

    ​​

    在批處理文件的開頭,然後用!c!代替%%c(已經因爲%%x形式的變量是for循環變量,你set設置沒有環境變量,這本身就是錯誤的 - 但%%p是正確的,因爲它 a for循環變量)。

    延遲擴展是必要的,因爲cmd將盡快發表聲明是解析,不能直接在其執行之前擴大變量的值。而且,for循環的整個塊都是單個語句,就cmd而言,因此,當循環運行時,任何環境變量都已擴展爲其值。

所以你最終與

setlocal enabledelayedexpansion 
for /f "tokens=*" %%p in (input.txt) do (
    echo %%p 
    pushd %%p 
    set /a c=0 
    for %%f in (*) do (
    echo %%f 
    if not exist *test*.* (
     set /a c+=1 
    ) 
) 
    if !c! GTR 0 echo %%p >>folders.txt 
    popd 
) 

(我還用pushd/popd,而不是cd更改目錄這是一個更好一點。)

+0

這是正確的,空間應避免,但'set/a'會自動刪除空格,所以'set/ac = 0'和'set/ac = 0'等價於 – jeb 2012-07-31 12:06:59

+0

非常感謝。它現在有效。我對此很陌生,但我還不知道所有的規則。所以謝謝你解釋。 – Rocshy 2012-07-31 12:07:07

+0

jeb:好的,我隱約記得儘可能多,但是imho在這種情況下最好不要讓壞習慣溜進來,如果你用'set'沒有'/ a'的話就會咬你 – Joey 2012-07-31 12:08:53