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

4

1 回答 1

1

你在这里有几个问题:

  1. =in周围不能有空格set

    set c=0
    set /a c+=1
    

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

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

    setlocal enabledelayedexpansion
    

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

    延迟扩展是必要的,因为将在解析cmd语句后立即将变量扩展为其值,而不是直接在其执行之前。就循环而言,整个循环块是一条语句,因此当循环运行时,任何环境变量都已经扩展为它们的值。forcmd

所以你会以

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更改目录,这更好一些。)

于 2012-07-31T12:02:54.390 回答