Batch file 使用延迟扩展时忽略If语句

Batch file 使用延迟扩展时忽略If语句,batch-file,if-statement,delayedvariableexpansion,Batch File,If Statement,Delayedvariableexpansion,我有一个需要两个的批处理文件,用一个名称重命名第一个文件,用另一个名称重命名第二个文件。变量设置为Y,然后在if语句中对变量使用延迟扩展。 代码从源位置读入两个文件,并将源位置和文件名放在txt文件中。因此,文件将如下所示: \servername\Reports\531627.REPORT.CSV \servername\Reports\531638.REPORT.CSV 然后,代码在文本文件中循环,将第一个文件复制并重命名为REPORTLST,然后将第二个文件重命名为REPORTAST。 现

我有一个需要两个的批处理文件,用一个名称重命名第一个文件,用另一个名称重命名第二个文件。变量设置为Y,然后在if语句中对变量使用延迟扩展。 代码从源位置读入两个文件,并将源位置和文件名放在txt文件中。因此,文件将如下所示: \servername\Reports\531627.REPORT.CSV \servername\Reports\531638.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\Reports\531627.REPORT.CSV     \\servername\c$\Gateway\REPORTLST.csv  
ECHO "IN IF" 
)  else (
COPY \\servername\Reports\531627.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\Reports\531638.ATMRECON.CSV \\servername\c$\Gateway\REPORTLST.csv   
ECHO "IN IF" 
)  else (
COPY \\servername\Reports\531638.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,但我看不出问题是什么。有什么想法吗?

您告诉程序设置FIRSTFILE=Y(注意空格,它是变量的一部分,但是
Y
永远不会是
Y

要避免这些不可见的空格,请习惯使用此
set
语法:

set "FIRSTFILE=Y"

(注意引号及其位置)

您告诉程序设置FIRSTFILE=Y(注意空格,它是变量的一部分,但是
Y
永远不会是
Y

要避免这些不可见的空格,请习惯使用此
set
语法:

set "FIRSTFILE=Y"
(注意引号及其位置)

写入
IF“!FIRSTFILE!”==“Y”
,因为
是比较字符串的一部分…写入
IF”!第一档!“==”Y“
,因为
是比较字符串的一部分…请注意,还指出了另一个问题…请注意,还指出了另一个问题。。。