2012-07-31 69 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