循环遍历批处理文件中的子目录

时间:2015-04-08 07:45:05

标签: batch-file

我有一个包含以下代码的批处理:

SET CI=MySubDir
SET CIDIR=SomePath\..\..\%CI%
SET OutDir=MyOutDir

for /f %%G in ('dir /b %CIDIR%') do (
    SET SCHEMADIR=%CIDIR%\%%G\schema
    SET CATDIR=%CIDIR%\%%G\catalog

    echo %%G
    echo %SCHEMADIR%
    echo %CATDIR%
    if exist %SCHEMADIR% (
        echo copy "%SCHEMADIR%" to "%OutDir%\..\Schema"
        XCOPY /E /Y /I /Q /D %SCHEMADIR% "%OutDir%\..\Schema"
    )

    if exist %CATDIR% (
        echo copy "%CATDIR%" to "%Outdir%\..\Catalog"
        XCOPY /E /Y /I /Q /D %CATDIR% "%OutDir%\..\Catalog"
    )
)

此程序应将SCHEMADIRCATDIR的任何子目录中的所有文件复制到我的OutDir(当然,OutDir中的文件可能会多次被覆盖取决于源目录中的现有内容)。

当我用echo %%G回显当前文件名时,我得到了所需的子目录,好奇地回显了SCHEMADIRCATDIR只导致找到的最后一个子目录在CIDIR内。因此,虽然%%G导致例如BE,SCHEMADIR结果为SomePath\..\..\MySubDir\TH(其中TH是MySubDir中的最后一个子目录)。这是什么意思?

1 个答案:

答案 0 :(得分:0)

在批处理文件中,解析,执行每行或每行(括号内的代码),并为下一行/块重复该过程。在解析阶段,将删除所有变量读取,并在代码开始执行之前使用变量中的值替换。如果变量在行/块内更改其值,则无法从同一行/块内检索此更改的值,因为变量读取操作不存在。

解决问题的通常方法是使用延迟扩展。启用后,您可以(在需要时)将语法从%var%更改为!var!,向解析器指示必须延迟读取操作,直到使用该值的命令开始执行。

您可以尝试使用此代码查看其实际操作

@echo off
    setlocal enabledelayedexpansion

    set "test=initial value"
    for %%a in (a b c) do (
        rem Variable changed inside the block of code
        set "test=%%a"

        rem Retrieve data with normal expansion 
        echo Normal expansion:  [%%a] [%test%]

        rem Retrieve data with delayed expansion
        echo Delayed expansion: [%%a] [!test!]
    )

在您的情况下,由于SCHEMADIRCATDIR更改为内部代码块,因此要检索同一块内的更改值 你需要延迟扩张。