检查 'if' 条件时出错 - Windows .bat

Error checking 'if' conditions - Windows .bat

我在处理多个 if 语句时遇到问题。

文件的重命名取决于第3列中的字符串(tokens=3)。我可以毫无问题地获取第 3 列字符串并将其设置为变量 %fy%,设置十六、十七和十八变量也没有问题。错误发生在多个 IF 语句中。注意 - 如果我只是 运行 带有 1 个 IF 语句的代码,它就可以正常工作。为什么多个 if 会导致此错误?

@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. 

试试这个...

@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=

将初始字符设置为双引号后,您需要在比较结束时匹配该双引号,因此我在开头有一个双引号,在结尾有两个双引号。

我相信 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