错误检查';如果';条件-Windows.bat

错误检查';如果';条件-Windows.bat,windows,batch-file,if-statement,conditional,Windows,Batch File,If Statement,Conditional,我在使用多个if语句时遇到问题 文件的重命名取决于第3列中的字符串(标记=3)。抓取第三列字符串并将其设置为变量%fy%没有问题,设置十六、十七和八个变量也没有问题。多个IF语句出现错误。注意-如果我只是用1个If语句运行代码,那么它工作正常。为什么多个“如果”会把这件事搞砸 @echo off for /f "tokens=3 delims=, skip=1" %%i in (DownloadedData.csv) do if not defined line set "fy=%%i"

我在使用多个if语句时遇到问题

文件的重命名取决于第3列中的字符串(标记=3)。抓取第三列字符串并将其设置为变量%fy%没有问题,设置十六、十七和八个变量也没有问题。多个IF语句出现错误。注意-如果我只是用1个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

你说“绊倒”是什么意思?多个不需要的if语句的结果是什么?“命令的语法不正确”是的,我在运行测试时也得到了。问题在于你的行
SET十六=^“2016财年^
。在我看来,这是不对的。^是一个按位OR运算,所以我不知道它对字符串做了什么。当我从命令行运行set命令时,它会提示我输入要添加到变量中的内容。只需删除^个字符即可。你不需要它们
set十六=“FY16
是您所需要的一切。@ManoDestra^是批处理中的转义字符。它在批处理中不是xor。+1,但如果转义,引号不必成对。您可以这样做:
如果^%fy%=^%16%goto YEAR16
。或者您可以在末尾使用一个引号:
如果%fy%=%16%“转到第16年
。从视觉上看,它看起来不平衡,但带3个引号的代码也不平衡;或者我会在比较之前删除所有引号:
set“fy=%fy:=%”
…Hi@dbenham,当使用代码的第一部分后接“you can vertical simplify your code to:”…无论第三列中是什么,无论是FY15、FY16、FY17…它仍然只捕获FY16部分并将文件名设置为“filename=DATA\u 2016.csv”“。我无法使用您发布的第二位,因为文件名比显示的要复杂得多。结果表明没有错误。多次运行此文件时,它会无限期地存储数据。我在重命名部分添加了startlocal和endlocal,效果很好。再次感谢!