/ f命令的批处理为什么我的程序不起作用?

时间:2015-05-07 14:39:10

标签: batch-file for-loop

出于某种原因,第一个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的批处理文件中是否有不同的语法(%%而不是%)?

3 个答案:

答案 0 :(得分:2)

您需要delayed expansion

@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!的标准回复,但我提倡的方法意味着您可以避免delayedexpansionif defined语法对目标变量的当前统计信息进行操作 - 当前是否已定义,如果您将set设置为某个值,则使用set "doit="来设置值{ {1}}处理内部if defined doit循环是否已清除标志变量doit

为什么使用这个复杂的方法而不是

for

是一个谜。毫无疑问,你有理由。