批量获取变量的值

时间:2012-07-31 11:55:19

标签: batch-file

我有以下代码:

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语句不起作用。我想知道如何访问我在第一个中设置的变量c,我该怎么做。我尝试过不同的组合,比如!c!或%c%但似乎没有任何效果。我错过了什么?

1 个答案:

答案 0 :(得分:1)

这里有一些问题:

  1. =中的set周围不能有空格:

    set c=0
    set /a c+=1
    

    否则,您将创建一个名称以空格结尾的变量。

  2. 您无法在块中设置变量并在不使用延迟扩展的情况下再次在同一块中使用它们。所以你需要

    setlocal enabledelayedexpansion
    

    在批处理文件的开头,然后使用!c!而不是%%c(这本身就是错误的,因为%%x形式的变量是for循环变量,而不是您使用set设置的环境变量 - 但%%p是正确的,因为 for循环变量。)

    延迟扩展是必要的,因为只要语句被解析cmd就会将变量扩展到它们的值,而不是在执行之前。就for而言,cmd循环的整个块都是单个语句,因此当循环运行时,任何环境变量都已扩展为其值。

  3. 所以你将以

    结束
    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来更改更好的目录。)