出于某种原因,第一个for语句下的语句都不会运行。我试图直接在for语句下输入一个暂停命令,它没有暂停。
@echo off
net use Z: X
Z:
for /f %%i in ('dir /a:d /b') do (
set doit=1
for /f %%x in ('dir /b Z:\%%i') do if %%x == X set doit=0
if %doit% == 1 echo %%i
)
我认为问题出现在第一个for语句中,因为即使我直接将命令放在for语句下也不会运行暂停命令。但是我尝试在命令提示符下键入for语句(没有%% i中的额外%)并且下面的语句运行得很好。那么cmd的批处理文件中是否有不同的语法(%%而不是%)?
答案 0 :(得分:2)
@echo off
net use Z: \\BRMH-FS01\StuHome$
Z:
setlocal enableDelayedExpansion
for /f %%i in ('dir /a:d /b') do (
set doit=1
for /f %%x in ('dir /b Z:\%%i') do if %%x == Fisher.png set doit=0
if !doit! == 1 echo %%i
)
答案 1 :(得分:1)
如果我能理解您的代码,%doit%
或!doit!
(npocmaka的所有操作都与EnableDelayedExpansion一致)并且内部for /f
循环似乎相当多余。
@echo off
net use Z: \\BRMH-FS01\StuHome$
Z:
for /f "delims=" %%i in ('dir /a:d /b') do If not exist "Z:\%%~i\Fisher.png" echo %%i
但是,如果有人会有条件地执行更多操作,请在下一个代码段中将set "doit=0"
保留在else
语句的if
分支中作为()
括号中的任何代码块不应该空着......
for /f "delims=" %%i in ('dir /a:d /b') do (
If not exist "Z:\%%~i\Fisher.png" (
set "doit=1"
echo %%i
) else (
set "doit=0"
)
)
资源(必读):
答案 2 :(得分:1)
令人遗憾的是,"它仍然没有工作"没有提供有助于解决问题的任何信息。你应该说明发生了什么以及你预期会发生什么,以及指示目标文件是否存在以及在哪里。
我建议了一些小修正:
for /f %%i in ('dir /a:d /b') do (
set doit=1
for /f %%x in ('dir /b Z:\%%i') do if /I "%%x"=="Fisher.png" set "doit="
if DEFINED doit echo %%i
)
你的"暂停失败"报告可能表明Z:
不包含子目录,因为for /f
将以基本格式列出子目录,但如果不存在子目录,则它不会执行主体。因此,如果您要查找Z:\Fisher.png
,则无法检测到它,否则您似乎正试图在Z:\
同样,使用您的第二个for
,您将找到与您的目标名称相对应的文件名。引用比较运算符==
的每一侧确保如果遇到包含 Space 之类的分隔符的文件名,则会保留正确的if
语法。如果需要,/I
会使比较不区分大小写。
这是使用delayededexpansion
和!var!
的标准回复,但我提倡的方法意味着您可以避免delayedexpansion
。 if defined
语法对目标变量的当前统计信息进行操作 - 当前是否已定义,如果您将set
设置为某个值,则使用set "doit="
来设置值{ {1}}处理内部if defined doit
循环是否已清除标志变量doit
。
为什么使用这个复杂的方法而不是
for
是一个谜。毫无疑问,你有理由。