2016-05-09 4 views
0

У меня есть пакетный файл, который занимает два, переименовывает первый файл с одним именем, а второй - другое имя. Переменная установлена ​​в Y, а затем замедленное расширение используется для переменной в выражении if. Код читает в двух файлах из местоположения SOURCE и помещает местоположение SOURCE и имена файлов в txt-файл. Таким образом, файл будет выглядеть так: \ servername \ Reports \ 531627.REPORT.CSV \ servername \ Reports \ 531638.REPORT.CSV Затем код перебирает текстовый файл, копирует и затем переименовывает первый файл в REPORTLST и затем второй на REPORTAST. Происходит мысль, что это утверждение игнорируется. Я распечатал переменную 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, но я не могу увидеть, что проблема есть. Есть идеи?

+1

Write 'IF == «Y» 'как' '' являются частью сравниваемых строк ... – aschipfl

ответ

2

Вы сказали программе set FIRSTFILE=Y   (обратите внимание на пробел, это часть переменной, но Y никогда не будет ).

Чтобы избежать этих невидимых пространств, привыкают использовать этот set синтаксис: "! FIRSTFILE"

set "FIRSTFILE=Y" 

(обратите внимание на кавычки и их положение)

+0

Это сработало! Большое спасибо! – user2073183

+2

Заметьте также [мой комментарий] (http://stackoverflow.com/questions/37120528/if- statement-being-ignored-when-use-delayed-expansion # comment61782773_37120528), который указывает на другую проблему ... – aschipfl

Смежные вопросы