我有一个包含以下代码的批处理:
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"
)
)
此程序应将SCHEMADIR
或CATDIR
的任何子目录中的所有文件复制到我的OutDir
(当然,OutDir
中的文件可能会多次被覆盖取决于源目录中的现有内容)。
当我用echo %%G
回显当前文件名时,我得到了所需的子目录,好奇地回显了SCHEMADIR
或CATDIR
只导致找到的最后一个子目录在CIDIR
内。因此,虽然%%G
导致例如BE,SCHEMADIR
结果为SomePath\..\..\MySubDir\TH
(其中TH是MySubDir中的最后一个子目录)。这是什么意思?
答案 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!]
)
在您的情况下,由于SCHEMADIR
和CATDIR
更改为内部代码块,因此要检索同一块内的更改值 你需要延迟扩张。