IF und ELSE treten gleichzeitig in dos auf

0

Ich kann nicht herausfinden, warum sowohl IF als auch ELSE gleichzeitig die Bedingung erfüllen.

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

Ich erhalte immer weniger als die Ausgabe:

good 
file doesn't exist
Avijit
quelle

Antworten:

0

Erstens : )Ihr Code enthält eine zusätzliche schließende Klammer. vereinfachtes Beispiel:

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
if 1==1 (
  echo good
  )
) else (
  echo file doesn't exist
)

Ausgabe:

==> D:\bat\SU\993931.bat
good
file doesn't exist

Zweitens : als allgemeine Regel, nie verwenden :labelnoch :: label-like commentein Befehlsblock eingeschlossen in innerhalb ()Klammern. Lesen Sie die Beweise und Beispiele

Schließlich als

Verwenden Sie (wieder als allgemeine Regel) die folgenden Anführungszeichen:

              if "%%~A" == "External_ID_vod__c" (
                if "%%~B" == "M_NA_BR_Credit_Limit_CU__c" (
                    if "%%~C" == "CurrencyISOCode" (
JosefZ
quelle
0

Ihre FOR-Schleife wird weiterhin ausgeführt, nachdem die Bedingung erfüllt ist. Es trifft die Bedingung, gibt "gut" aus, setzt die Schleife in den nächsten Zyklen fort, wobei die Bedingung erneut getroffen wird, was zu einer falschen und der Ausgabe "Datei existiert nicht" führt.

Sie sollten entweder eine Bedingung zu Ihrer FOR-Schleife hinzufügen, die den Code dazu bringt, sie zu verlassen, damit die wahre Bedingung erreicht wird, oder ein goto setzen, um die falsche Bedingung zu umgehen, wenn true erfüllt ist.

Eric F
quelle
Wenn die if exist %filename%Bedingung nicht erfüllt ist , wird meines Erachtens nur die Steuerung an einen anderen Teil übergeben und der Ausdruck "Datei existiert nicht" ausgegeben.
Avijit
Sie können einfach Ihr "goto: break" nach Ihrem "echo good" setzen und Ihr ": break" nach Ihrer IF-Anweisung unten einfügen
Eric F
0

Eine andere Option kann sein, einfach keine ELSE-Anweisung zu verwenden. Das folgende Beispiel verwendet weniger Klammern als der frühere Beispielcode, sollte jedoch äquivalent sein.

@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
TOOGAM
quelle