2016-03-15 3 views
-1

У меня возникают проблемы с несколькими операторами if.Ошибка проверки условий «если» - Windows .bat

Переименование файла зависит от строки в третьем столбце (токены = 3). У меня нет проблем с захватом третьей строки столбца и установкой ее переменной% fy%, и никаких проблем с настройкой шестнадцати, семнадцати и восемнадцати переменных. Ошибка возникает при использовании нескольких операторов IF. Примечание. Если я просто запускаю код с инструкцией 1 IF, он работает правильно. Почему многократные ifs отключают это?

@echo off 

for /f "tokens=3 delims=, skip=1" %%i in (DownloadedData.csv) do if not defined line set "fy=%%i" 
    echo %fy% 

SET sixteen=^"FY16^ 
SET seventeen=^"FY17^   
SET eightteen=^"FY18^ 

IF %fy% == %sixteen% goto :YEAR16 
IF %fy% == %seventeen% goto :YEAR17 
IF %fy% == %eightteen% goto :YEAR18 

:YEAR16 
set "filename=DATA_2016.csv" 
echo %filename% 
goto :COMMONEXIT 
:YEAR17 
set "filename=DATA_2017.csv" 
echo %filename% 
goto :COMMONEXIT 
:YEAR18 
set "filename=DATA_2018.csv" 
echo %filename% 
goto :COMMONEXIT 

:COMMONEXIT 
pause 

REM - Code then goes on to use the filename variable to rename the file in the download folder. 
+0

Когда вы говорите «расцепления это вверх» , что вы имеете в виду? В чем причина нежелательных действий нескольких операторов if? – ManoDestra

+0

«Синтаксис команды неверен» –

+0

Да, я тоже получаю это при запуске теста. Проблема заключается в вашей строке 'SET sixteen = ^" FY16^'. Это не выглядит корректно для меня.^Является побитовой операцией ИЛИ, поэтому я не знаю, что это делает со строкой. И когда я запускаю который устанавливает команду из командной строки, он запрашивает у меня ввод для добавления в переменную. – ManoDestra

ответ

1

Я считаю, что у ManoDestra есть рабочее решение.

Я думаю, что ваше заявление FOR/F неверно. Я считаю, что вы хотели

set "fy=" 
for /f .... do if not defined fy set "fy=%%i" 

Если это так, то вы могли бы значительно упростить код для:

@echo off 

for /f "tokens=3 delims=, skip=1" %%i in (DownloadedData.csv) do goto %%i 

:"FY16 
set "filename=DATA_2016.csv" 
echo %filename% 
goto :COMMONEXIT 
:"FY17 
set "filename=DATA_2017.csv" 
echo %filename% 
goto :COMMONEXIT 
:"FY18 
set "filename=DATA_2018.csv" 
echo %filename% 
goto :COMMONEXIT 

:COMMONEXIT 
pause 

REM - Code then goes on to use the filename variable to rename the file in the download folder 

Или еще лучше:

@echo off 

set "fy=" 
for /f "tokens=3 delims=, skip=1" %%i in (DownloadedData.csv) do if not defined fy set "fy=%%i" 
set "filename=DATA_20%fy:~-2%.csv" 
echo %filename% 
pause 
REM - Code then goes on to use the filename variable to rename the file in the download folder 
+0

Привет @dbenham, при использовании первая часть кода, за которой следует «вы могли бы значительно упростить свой код:« ..... независимо от того, что находится в третьем столбце, будь то его FY15, FY16, FY17 ... его все еще только захватывает раздел FY16 и задает имя файла на "filename = DATA_2016.csv". Я не могу использовать второй бит, который вы опубликовали, потому что имя файла намного сложнее, чем показано. –

+0

Оказывается, ошибки не было. При запуске этого файла несколько раз он сохранял fy бесконечно. Я добавил startlocal и endlocal вокруг раздела переименования, и он сработал. Еще раз спасибо! –

1

Попробуйте это ...

@echo off 

for /f "tokens=3 delims=, skip=1" %%i in (DownloadedData.csv) do if not defined line set "fy=%%i" 
echo %fy% 

SET sixteen="FY16 
SET seventeen="FY17 
SET eighteen="FY18 

IF "%fy%"" == "%sixteen%"" goto YEAR16 
IF "%fy%"" == "%seventeen%"" goto YEAR17 
IF "%fy%"" == "%eighteen%"" goto YEAR18 
GOTO COMMONEXIT :: Here, if you wish to exit as a default if none matched. Otherwise, it will fall into YEAR16. 

:YEAR16 
set filename=DATA_2016.csv 
goto COMMONEXIT 

:YEAR17 
set filename=DATA_2017.csv 
goto COMMONEXIT 

:YEAR18 
set filename=DATA_2018.csv 
goto COMMONEXIT 

:COMMONEXIT 
echo %filename% 
pause 

REM - Code then goes on to use the filename variable to rename the file in the download folder. 

set fy= 
set sixteen= 
set seventeen= 
set eighteen= 

При установке начального символа быть двойные кавычки, то вы должны совпадать, что двойные кавычки в конце вашего сравнения, следовательно, почему у меня есть одиночная двойная кавычка в начале и две в конце.

+0

+1, но кавычки не должны быть спарены, если они экранированы. Вы могли бы сделать это:' IF ^% fy% == ^% шестнадцать% goto YEAR16'. мог бы использовать одну цитату в конце: 'IF% fy%" ==% шестнадцать% "goto YEAR16'. Визуально это выглядит неуравновешенным, но так же делает ваш код с тремя кавычками. – dbenham

+0

Я бы использовал задержанное расширение для такой строки сравнение, поскольку они потерпят неудачу, если одно из значений имеет сбалансированную цитату, или я удалю все кавычки перед сравнением: 'set 'fy =% fy:" =% "' ... – aschipfl