我正在做一份工作,使用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,如图所示。如何更改语句以使其按预期工作?
我将第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也在指定的范围内。在这种情况下,它复制了错误的文件。
答案 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%%
更改值的var
。 CALL 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
语法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="