我有以下代码:
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%但似乎没有任何效果。我错过了什么?
答案 0 :(得分:1)
这里有一些问题:
=
中的set
周围不能有空格:
set c=0
set /a c+=1
否则,您将创建一个名称以空格结尾的变量。
您无法在块中设置变量并在不使用延迟扩展的情况下再次在同一块中使用它们。所以你需要
setlocal enabledelayedexpansion
在批处理文件的开头,然后使用!c!
而不是%%c
(这本身就是错误的,因为%%x
形式的变量是for
循环变量,而不是您使用set
设置的环境变量 - 但%%p
是正确的,因为 是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
来更改更好的目录。)