如果不存在在 Windows 批处理中不起作用

Posted

技术标签:

【中文标题】如果不存在在 Windows 批处理中不起作用【英文标题】:IF NOT EXIST not working in Windows Batch 【发布时间】:2021-04-24 04:25:29 【问题描述】:

我正在尝试在 Windows 批处理文件中插入“如果不存在”,在该文件中,另一个具有相同格式的类似 IF 正在工作 - 在研究和测试后无法解释为什么这个失败。

第二个如果不存在按预期工作当第一个被 REMd 退出时

格式相同,定义%INIFile%

@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

【问题讨论】:

请阅读minimal reproducible example。 读取并减少到它的可重现失败状态 - REMing out the first IF NOT EXIST 会产生一个工作示例。 在使用它之前,除了没有在代码中的任何地方定义%LogFile%,你也没有在任何地方定义你当前的工作目录。由于我们不知道您当前的目录是什么,因此我们无法知道当您调用脚本时,其中是否存在Parameters_INI.ini @Compo。该示例运行在任何目录中,所有文件都在同一个目录中 - 是的!,我现在看到,日志文件在使用之前没有定义,但在之后的部分......有时这是我错过的简单事情。谢谢 如果脚本一直在你的ini文件所在目录,使用相对路径.\ 不一定正确,因为批处理文件目录,只会是当前目录,如果脚本未提升并从 GUI 运行。最好建议您使用完整路径,或者从一开始就专门定义您的当前目录。如果当前目录始终是批处理脚本本身的目录,则应使用%~dp0 而不是.\ 【参考方案1】:
    echo ERROR: List file "%ListFile%" not found.>>%LogFile%

您似乎从未将LogFile 设置为一个值,因此如果未设置,则当它在行尾单独解析为&gt;&gt; 时,该行将失败是无效的语法,甚至如果它没有运行。

如果您在批处理文件之前或在批处理文件的第一行中设置LogFile,其余部分应该可以工作。

【讨论】:

以上是关于如果不存在在 Windows 批处理中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

多处理、动态嵌套管理器在 Windows 中不起作用(在 Mac 上很好)

选择 case 语句在 oracle 中不起作用

Windows 身份验证在 Flex 中不起作用

AppSearch 在 Windows 7 中不起作用

Astyle 在 Windows 中不起作用

XAMPP 在 Windows 10 中不起作用