Search code examples
if-statementbatch-fileini

IF NOT EXIST not working in Windows Batch


I am trying to insert an "if not exist" in a windows batch file where another similar IF with the same formatting IS working - can't tell why this one fails after researching and testing.

The second If not exist working as expected When the first is REMd out

Formatting is the same, %INIFile% is defined

@echo off
setlocal EnableExtensions Enabledelayedexpansion
set "TODAY=%Date:~4,2%-%Date:~7,2%-%Date:~12,2%"
set "NOW=%time:~0,2%.%time:~3,2%.%time:~6,2%"
set "TempFile=%TEMP%\%~n0.tmp"
set "INIFile=Parameters_INI.ini"

if not exist ".\%INIFile%" (
    echo ERROR: List file "%INIFile%" not found.
    echo ERROR: List file "%INIFile%" not found.>>%LogFile%
    goto :EndBatch
)

:: Get Parameters
call :get-ini %INIFile% Parameters ListFile result
Set "ListFile=%result%"    
call :get-ini %INIFile% Output LogName result
Set "LogFile=%result%_%EntryName%_%TODAY%_T%NOW%_Log.txt"


Echo INI File Updater
Echo PC List: %ListFile%
Echo PC List: %ListFile%>>%LogFile%
    
if not exist ".\%ListFile%" (
    echo ERROR: List file "%ListFile%" not found.
    echo ERROR: List file "%ListFile%" not found.>>%LogFile%
    goto :EndBatch
)
goto :EndBatch

:get-ini <filename> <section> <key> <result>
  set %~4=
  set insection=
  for /f "usebackq eol=; tokens=*" %%a in ("%~1") do (
    set line=%%a
    if defined insection (
      for /f "tokens=1,* delims==" %%b in ("!line!") do (
        if /i "%%b"=="%3" (
          endlocal
          set %~4=%%c
          goto :eof
        )
      )
    )
    if "!line:~0,1!"=="[" (
      for /f "delims=[]" %%b in ("!line!") do (
        if /i "%%b"=="%2" (
          set insection=1
        ) else (
          endlocal
          if defined insection goto :eof
        )
      )
    )
  )

:EndBatch
endlocal
pause

Parameters_INI.ini

[Parameters]
ListFile=PCList.txt
Target=SMSStart.ini
TarDIR=Storeman
SectionName=[Maintenance]
EntryName=Reboot
NewValue=1

[Output]
LogName=INI_Update

PCList.txt

LAB-LANE005
LAB-LANE006
LAB-LANE001
LAB-LANE007
LAB-LANE008

Solution

  •     echo ERROR: List file "%ListFile%" not found.>>%LogFile%
    

    You don't appear to have ever set LogFile to a value, so if it's not set, this line will fail when it's parsed as >> on it's own at the end of the line is invalid syntax, even if it's not run.

    If you set LogFile before the batch file, or in the first lines of your batch file, the rest should work.