我无法弄清楚为什么 IF 和 ELSE 同时满足条件。
@echo off
setlocal enabledelayedexpansion enableextensions
Set filename=Credit_Limits\Input\BR_Credit_Limit_Upload.csv
if exist %filename% (
FOR /F "tokens=1-3* delims=," %%A IN (%filename%) DO (
if %%~A == External_ID_vod__c (
if %%~B == M_NA_BR_Credit_Limit_CU__c (
if %%~C == CurrencyISOCode (
echo good
)
)
)
goto :break
)
)
:break
) else (
echo file doesn't exist
)
我总是得到以下输出:
good
file doesn't exist
答案1
第一的:您的代码中有一个多余的)
右括号;简化的示例:
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
if 1==1 (
echo good
)
) else (
echo file doesn't exist
)
输出:
==> D:\bat\SU\993931.bat
good
file doesn't exist
第二: 作为基本规则,绝不在括号内的命令块中使用:label
nor 。有关证明和示例,请阅读:: label-like comment
()
最后, 作为
%%~A
或者%%~B
可能%%~C
包含一些cmd
应该转义的有害字符, 或者%%~B
或者%%~C
可能导致空字符串(尝试if == A echo any
),
使用(再次作为一般规则)正确的双引号如下:
if "%%~A" == "External_ID_vod__c" (
if "%%~B" == "M_NA_BR_Credit_Limit_CU__c" (
if "%%~C" == "CurrencyISOCode" (
答案2
条件满足后,您的 FOR 循环仍在运行。它满足条件,输出“good”,继续运行下一个周期的循环,然后再次满足条件,结果为 false,并给出“文件不存在”的输出。
您应该在 FOR 循环中添加一个条件,使代码在达到真实条件的结果中退出循环,或者添加一个 goto,以便在满足真实条件时绕过虚假条件。
答案3
另一个选择可能是不使用 ELSE 语句。以下示例使用的括号比之前的示例代码少,但应该是等效的。
@Echo Off
SETLOCAL EnableExtensions EnableDelayedExpansion
Set filename=Credit_Limits\Input\BR_Credit_Limit_Upload.csv
if NOT exist %filename% goto nofile
FOR /F "tokens=1-3* delims=," %%A IN (%filename%) DO (
if "%%~A" == "External_ID_vod__c" if "%%~C" == "CurrencyISOCode" (
if "%%~B" == "M_NA_BR_Credit_Limit_CU__c" echo good
)
)
goto done
:nofile
echo File doesn't exist
:done