Endlocal& “set var”在“for”循环中没有按预期工作

时间:2015-01-24 06:33:58

标签: batch-file for-loop cmd local-variables

我正在做一份工作,使用BATCH文件将文件从一个位置复制到另一个位置。我将我的陈述分为三个部分,一个是程序驱动程序,一个是在每个子目录下生成文件列表,另一个是用于检查文件名和。做实际的复制。

1.PROGRAM DRIVER

IF EXIST TEMP.TXT DEL TEMP.TXT
CD>TEMP.TXT
set /p ROOT=<TEMP.TXT

rem PARA is the date to copy
SET PARA=2013-08-06
ECHO %PARA%
CD %ROOT%\%PARA%
FOR /R %%A IN (.) DO (    ::COPY SUB-LOGIC FILE TO EACH SUB-DIRECTORY
    ECHO NOW IN %%A
    CD %%A
    XCOPY "%ROOT%\WORK.BAT" . /K /Y
    XCOPY "%ROOT%\CORE.BAT" . /K /Y
    ECHO LOOP OUT.
)

CD %ROOT%\%PARA%
FOR /R %%A IN (.) DO (
    ECHO NOW IN %%A
    CD %%A
    CALL WORK.BAT        ::GENERATING FILE LIST
    ECHO LOOP OUT.
)

CD %ROOT%\%PARA%
FOR /R %%A IN (.) DO (
    ECHO NOW IN %%A
    CD %%A
    CALL CORE.BAT        ::DOING COPY STUFF
    ECHO LOOP OUT.
)

PAUSE

2.WORK.BAT

IF EXIST FILE.TXT DEL FILE.TXT
FOR %%B IN (*.wav) DO ECHO %%~nxB>>FILE.TXT

3.COPYING STUFF

FOR %%F IN ("%CD%") DO SET CURDIR=%%~nxF
IF NOT EXIST FILE.TXT GOTO END
SET CCC="FALSE"  ::IF NO CCC DECLARED HERE,BELOW FOR LOOP WILL BE SKIPPED
PAUSE
FOR /F %%C IN (FILE.TXT) DO (
    SETLOCAL
    SET RES="FALSE"
    IF "%%C" GEQ "CH201_00000000_000.WAV" SET RES="TRUE"
    IF "%%C" LEQ "CH300_FFFFFFFF_FFF.WAV" (
         SET RES="TRUE"
    ) ELSE ( SET RES="FALSE")
    ENDLOCAL& SET CCC=%RES%    *::VAR CCC NOT UPDATED*
    PAUSE
    IF %CCC% EQU "TRUE" (
        IF NOT EXIST D:\PHILIPS\%PARA%\%PARA%\%CURDIR% MD D:\PHILIPS\%PARA%\%PARA%\%CURDIR%
        XCOPY "%ROOT%\%PARA%\%CURDIR%\%%C" D:\PHILIPS\%PARA%\%PARA%\%CURDIR% /K /Y
    )
)
:END
ECHO LOOP OUT

我的问题是,为什么我的&#34; ENDLOCAL&amp; SET&#34;声明不起作用,即每次都是NULL,如图所示。如何更改语句以使其按预期工作?

First image

Second image


我将第3部分更改为

FOR %%F IN ("%CD%") DO SET CURDIR=%%~nxF
IF NOT EXIST FILE.TXT GOTO END
SET "RES="
PAUSE
FOR /F %%C IN (FILE.TXT) DO (
    SET "RES="
    IF "%%C" GEQ "CH201_00000000_000.WAV" SET "RES=Y"
    IF "%%C" LEQ "CH300_FFFFFFFF_FFF.WAV" (
        SET "RES=Y"
    ) ELSE ( SET "RES=" )
    PAUSE
    IF DEFINED RES (
            IF NOT EXIST D:\PHILIPS\%PARA%\%PARA%\%CURDIR% MD D:\PHILIPS\%PARA%\%PARA%\%CURDIR%
            XCOPY "%ROOT%\%PARA%\%CURDIR%\%%C" D:\PHILIPS\%PARA%\%PARA%\%CURDIR% /K /Y
    )
)

似乎RES始终定义,甚至FILENAME也在指定的范围内。在这种情况下,它复制了错误的文件。

New runtime result

1 个答案:

答案 0 :(得分:1)

in(3)

FOR /F %%C IN (FILE.TXT) DO (
    SETLOCAL
    SET RES="FALSE"
    IF "%%C" GEQ "CH201_00000000_000.WAV" SET RES="TRUE"
    IF "%%C" LEQ "CH300_FFFFFFFF_FFF.WAV" (
         SET RES="TRUE"
    ) ELSE ( SET RES="FALSE")
    ENDLOCAL& SET CCC=%RES%    *::VAR CCC NOT UPDATED*
    PAUSE
    IF %CCC% EQU "TRUE" (
        IF NOT EXIST D:\PHILIPS\%PARA%\%PARA%\%CURDIR% MD D:\PHILIPS\%PARA%\%PARA%\%CURDIR%
        XCOPY "%ROOT%\%PARA%\%CURDIR%\%%C" D:\PHILIPS\%PARA%\%PARA%\%CURDIR% /K /Y
    )
)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

请注意使用显示CALL ECHO %%var%%更改值的varCALL ECHO %%errorlevel%%显示,但遗憾的是RESETS错误级别。

如果涉及旗帜,情况会再次发生变化。 set "flag="将确保清除标记。 set "flag=somethingelse"将确保设置(值不相关。)使用if defined flag (doiftrue) else (doiffalse)适用于flag运行时(当前)状态 - 而不是分析时间值。

因此,我建议您更改处理方式,使用ccc语句或set "ccc="语句将set "ccc=y"设置为 nothing ,然后您可以进行测试使用if [not] defined ccc

获取true / false

语法SET "var=value"(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a可以安全地使用“无报价”。


(修订后的代码)

您的测试不正确。

res 设置为Y,其值为CH145... CH201... 但是Y测试设置为LEQ,因为CH145... 高于或等于CH300...

您可以级联设置:

if "%%C" GEQ "CH201..." IF "%%C" LEQ "CH300..." set "res=Y"

或登上考试

IF "%%C" GEQ "CH201_00000000_000.WAV" SET "RES=Y"
if defined res IF "%%C" GTR "CH300_FFFFFFFF_FFF.WAV" SET "RES="