使用延迟扩展时忽略 If 语句
If statement being ignored when using delayed expansion
我有一个包含两个文件的批处理文件,将第一个文件重命名为一个名称,将第二个文件重命名为另一个名称。变量设置为 Y,然后在 if 语句中对变量使用延迟扩展。
代码从 SOURCE 位置读取两个文件,并将 SOURCE 位置和文件名放在一个 txt 文件中。所以该文件将如下所示:
\servername\Reports1627.REPORT.CSV
\servername\Reports1638.REPORT.CSV
然后代码循环遍历文本文件,复制第一个文件并将其重命名为 REPORTLST,然后将第二个文件重命名为 REPORTAST。
正在发生的事情是 if 语句被忽略了。我已经打印出 FIRSTFILE 变量以确认它是 Y,但第一个文件从未被复制和重命名。
这是代码:
SetLocal EnableDelayedExpansion
@ECHO ON
if %1.==. (GOTO PARMERR) ELSE (SET ORIGFILENAME=%1)
if %2.==. (GOTO PARMERR) ELSE (SET SOURCE=%2)
if %3.==. (GOTO PARMERR) ELSE (SET DESTINATION=%3)
if %4.==. (GOTO PARMERR) ELSE (SET SMALLFILENAME=%4)
if %5.==. (GOTO PARMERR) ELSE (SET LARGEFILENAME=%5)
SET FIRSTFILE=Y
IF EXIST %SOURCE%dirlist.txt DEL %SOURCE%dirlist.txt
DIR %SOURCE%*%ORIGFILENAME% /B /S >> %SOURCE%DIRLIST.TXT
FOR /F "eol=; tokens=1* delims=," %%m in (%SOURCE%DIRLIST.TXT) DO (
ECHO !FIRSTFILE!
IF !FIRSTFILE! == "Y" (
COPY %%m %DESTINATION%%SMALLFILENAME%
ECHO "IN IF"
) else (
COPY %%m %DESTINATION%%LARGEFILENAME%
ECHO "IN ELSE"
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
del dirlist.txt
:RENAMEERROR
ECHO ****RENAME FAILED******
set err=4
GOTO END
:INVALIDSOURCE
ECHO ****cOULD NOT CD OR INVALID SOURCE******
set err=3
GOTO END
:INVALIDDESTINATION
ECHO ****cOULD NOT COPY OR INVALID DEST******
set err=2
GOTO END
:PARMERR
ECHO ****MISSING OR INVALID PARAMETER******
set err=1
GOTO END
set err=0
GOTO END
:END
EndLocal
exit /B %err%
这是打印出来的内容:
C:\Windows\system32>(
ECHO !FIRSTFILE!
IF !FIRSTFILE! == Y (
COPY \servername\Reports1627.REPORT.CSV \servername\c$\Gateway\REPORTLST.csv
ECHO "IN IF"
) else (
COPY \servername\Reports1627.REPORT.CSV \servername\c$\Gateway\REPORTAST.csv
ECHO "IN ELSE"
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
Y
1 file(s) copied.
"IN ELSE"
Y
N
C:\Windows\system32>(
ECHO !FIRSTFILE!
IF !FIRSTFILE! == "Y" (
COPY \servername\Reports1638.ATMRECON.CSV \servername\c$\Gateway\REPORTLST.csv
ECHO "IN IF"
) else (
COPY \servername\Reports1638.ATMRECON.CSV \servername\c$\Gateway\REPORTAST.csv
ECHO "IN ELSE"
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
N
1 file(s) copied.
"IN ELSE"
N
N
所以你可以看到它总是进入 ELSE 但我看不出问题是什么。有什么想法吗?
你告诉程序 set FIRSTFILE=Y
(注意 space,它是变量的一部分,但 Y
永远不会是 Y
)。
为了避免那些不可见的 spaces,习惯使用这个 set
语法:
set "FIRSTFILE=Y"
(注意引号及其位置)
我有一个包含两个文件的批处理文件,将第一个文件重命名为一个名称,将第二个文件重命名为另一个名称。变量设置为 Y,然后在 if 语句中对变量使用延迟扩展。 代码从 SOURCE 位置读取两个文件,并将 SOURCE 位置和文件名放在一个 txt 文件中。所以该文件将如下所示: \servername\Reports1627.REPORT.CSV \servername\Reports1638.REPORT.CSV 然后代码循环遍历文本文件,复制第一个文件并将其重命名为 REPORTLST,然后将第二个文件重命名为 REPORTAST。 正在发生的事情是 if 语句被忽略了。我已经打印出 FIRSTFILE 变量以确认它是 Y,但第一个文件从未被复制和重命名。 这是代码:
SetLocal EnableDelayedExpansion
@ECHO ON
if %1.==. (GOTO PARMERR) ELSE (SET ORIGFILENAME=%1)
if %2.==. (GOTO PARMERR) ELSE (SET SOURCE=%2)
if %3.==. (GOTO PARMERR) ELSE (SET DESTINATION=%3)
if %4.==. (GOTO PARMERR) ELSE (SET SMALLFILENAME=%4)
if %5.==. (GOTO PARMERR) ELSE (SET LARGEFILENAME=%5)
SET FIRSTFILE=Y
IF EXIST %SOURCE%dirlist.txt DEL %SOURCE%dirlist.txt
DIR %SOURCE%*%ORIGFILENAME% /B /S >> %SOURCE%DIRLIST.TXT
FOR /F "eol=; tokens=1* delims=," %%m in (%SOURCE%DIRLIST.TXT) DO (
ECHO !FIRSTFILE!
IF !FIRSTFILE! == "Y" (
COPY %%m %DESTINATION%%SMALLFILENAME%
ECHO "IN IF"
) else (
COPY %%m %DESTINATION%%LARGEFILENAME%
ECHO "IN ELSE"
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
del dirlist.txt
:RENAMEERROR
ECHO ****RENAME FAILED******
set err=4
GOTO END
:INVALIDSOURCE
ECHO ****cOULD NOT CD OR INVALID SOURCE******
set err=3
GOTO END
:INVALIDDESTINATION
ECHO ****cOULD NOT COPY OR INVALID DEST******
set err=2
GOTO END
:PARMERR
ECHO ****MISSING OR INVALID PARAMETER******
set err=1
GOTO END
set err=0
GOTO END
:END
EndLocal
exit /B %err%
这是打印出来的内容:
C:\Windows\system32>(
ECHO !FIRSTFILE!
IF !FIRSTFILE! == Y (
COPY \servername\Reports1627.REPORT.CSV \servername\c$\Gateway\REPORTLST.csv
ECHO "IN IF"
) else (
COPY \servername\Reports1627.REPORT.CSV \servername\c$\Gateway\REPORTAST.csv
ECHO "IN ELSE"
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
Y
1 file(s) copied.
"IN ELSE"
Y
N
C:\Windows\system32>(
ECHO !FIRSTFILE!
IF !FIRSTFILE! == "Y" (
COPY \servername\Reports1638.ATMRECON.CSV \servername\c$\Gateway\REPORTLST.csv
ECHO "IN IF"
) else (
COPY \servername\Reports1638.ATMRECON.CSV \servername\c$\Gateway\REPORTAST.csv
ECHO "IN ELSE"
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
N
1 file(s) copied.
"IN ELSE"
N
N
所以你可以看到它总是进入 ELSE 但我看不出问题是什么。有什么想法吗?
你告诉程序 set FIRSTFILE=Y
(注意 space,它是变量的一部分,但 Y
永远不会是 Y
)。
为了避免那些不可见的 spaces,习惯使用这个 set
语法:
set "FIRSTFILE=Y"
(注意引号及其位置)