如果不存在在 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
设置为一个值,因此如果未设置,则当它在行尾单独解析为>>
时,该行将失败是无效的语法,甚至如果它没有运行。
如果您在批处理文件之前或在批处理文件的第一行中设置LogFile
,其余部分应该可以工作。
【讨论】:
以上是关于如果不存在在 Windows 批处理中不起作用的主要内容,如果未能解决你的问题,请参考以下文章