IF e ELSE ambos são eventuating ao mesmo tempo em dos

0

Eu não consigo entender por que, ao mesmo tempo, tanto o IF como o ELSE estão satisfazendo a condição.

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

Estou sempre abaixo da saída:

good 
file doesn't exist
    
por Avijit 30.10.2015 / 14:10

3 respostas

0

Primeiro : há um parêntese de fechamento extra ) em seu código; exemplo simplificado:

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

Saída:

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

Segundo : como regra geral, nunca use :label nor :: label-like comment dentro de um bloco de comando entre () parênteses. Para provas e exemplos, leia

Finalmente , como

  • %%~A ou %%~B ou %%~C podem conter alguns caracteres venenosos cmd que devem ser ignorados , ou
  • %%~B ou %%~C pode resultar em uma string vazia (tente if == A echo any ),

use (novamente como regra geral) aspas duplas adequadas da seguinte forma:

              if "%%~A" == "External_ID_vod__c" (
                if "%%~B" == "M_NA_BR_Credit_Limit_CU__c" (
                    if "%%~C" == "CurrencyISOCode" (
    
por 30.10.2015 / 18:36
0

Seu loop FOR ainda está em execução depois que a condição é atendida. Ele atinge a condição, gera "bom", continua executando o loop nos próximos ciclos, ao qual atinge a condição novamente, resultando em um falso e fornecendo a saída "arquivo não existe".

Você deve adicionar uma condição ao seu loop FOR que fará o código sair no resultado que a condição verdadeira for atingida, ou colocar um goto, para ignorar a falsa condição se true for atendido.

    
por 30.10.2015 / 14:28
0

Outra opção pode ser simplesmente não usar uma instrução ELSE. O exemplo a seguir usa menos parênteses do que o código de amostra anterior, mas deve ser equivalente.

@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
    
por 30.10.2015 / 20:03

Tags