使用 Windows 批处理在多台 PC 上修改 INI 文件中的特定设置

Modify a specific setting in an INI file on multiple PCs using Windows Batch

我的目标是使用外部 PC 列表通过网络在多台 PC 上修改 INI 文件中的单个设置,并将结果输出到日志文件。

到目前为止,我已经找到并修改了一个脚本,该脚本将在本地编辑一个文件,但无法让它与 FOR/DO 循环一起工作来为列表中的每台 PC 处理该操作 -或者 - 添加日志输出

@Echo Off
SetLocal EnableDelayedExpansion

Set _PathtoFile=C:\Test\Sample.ini
Set _OldLine=Reboot=
Set _NewLine=Reboot=1

Call :_Parse "%_PathtoFile%"
Set _Len=0
Set _Str=%_OldLine%
Set _Str=%_Str:"=.%987654321

:_Loop
If NOT "%_Str:~18%"=="" Set _Str=%_Str:~9%& Set /A _Len+=9& Goto _Loop
Set _Num=%_Str:~9,1%
Set /A _Len=_Len+_Num
PushD %_FilePath%
If Exist %_FileName%.new Del %_FileName%.new
If Exist %_FileName%.old Del %_FileName%.old
Set _LineNo=0
For /F "Tokens=* Eol=" %%I In (%_FileName%%_FileExt%) Do (
    Set _tmp=%%I
    Set /A _LineNo+=1
    If /I "!_tmp:~0,%_Len%!"=="%_OldLine%" (
        >>%_FileName%.new Echo %_NewLine%
    ) Else (
        If !_LineNo! GTR 1 If "!_tmp:~0,1!"=="[" Echo.>>%_FileName%.new
        SetLocal DisableDelayedExpansion
        >>%_FileName%.new Echo %%I
        EndLocal
    ))
Ren %_FileName%%_FileExt% %_FileName%.old
Ren %_FileName%.new %_FileName%.ini
PopD
Goto :EOF

:_Parse
Set _FilePath=%~dp1
Set _FileName=%~n1
Set _FileExt=%~x1
Goto :EOF

示例文件如下:Settings.ini

[SAMPLE SETTINGS]
SERVER=MYPC
Reboot=0
[SECTION2]
SETTINGX=1234
[SECTION3]
SETTINGX=4567

PCList.txt

MY-PC
YOUR_PC
NETSERVER
192.168.10.100

我仍在努力思考这个脚本所做的一切——这是技术人员的回答中提供的唯一信息(初始脚本的来源) 它通过使用 .old 扩展名重命名来保留原始文件 它将删除所有空行,但会在任何以 [ 开头的行之前插入一个空行(除非它是文件中的第一行)

I get the length of the specified search line in case the old line in the file has trailing spaces.
If more than one line starts with the old line text, it will be changed as well. Example, if the file has these lines: test=line1 test=line1 again and you set _OldLine to test=line1, both lines will be changed.
If that might be a problem,
change this line:
If /I "!_tmp:~0,%_Len%!"=="%_OldLine%" (
to this:
If /I "!_tmp!"=="%_OldLine%" (
Just keep in mind that with this, if the old line in the file has trailing spaces, it won't be changed unless you include them in the _OldLine variable

此时我需要做的主要事情是使用上述脚本...或类似的东西,在外部 TXT 文件中列出的 PC 列表上通过网络执行此操作。我愿意接受其他方法,只要它们是 windows 批处理脚本,并且不包括调用外部应用程序。

愿望清单,(目前不需要)

任务的批处理文件代码

我建议使用以下代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SectionName=[SAMPLE SETTINGS]"
set "EntryName=Reboot"
set "EntryValue=1"
set "LogFile=%~dpn0.log"
set "TempFile=%TEMP%\%~n0.tmp"
set "ListFile=%~dp0PCList.txt"

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

del /A /F "%LogFile%" 2>nul
for /F "usebackq delims=" %%I in ("%ListFile%") do call :UpateIniFile "\%%I\C$\Test\Sample.ini"
goto EndBatch

:UpateIniFile
if not exist %1 (
    echo File not found:   %1>>"%LogFile%"
    goto :EOF
)
set "EmptyLines="
set "EntryUpdate="
set "CopyLines="
(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" %1 2^>nul') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    if defined CopyLines (
        echo(!Line:*:=!
        endlocal
    ) else if not defined EntryUpdate (
        echo(!Line:*:=!
        if /I "!Line:*:=!" == "!SectionName!" (
            endlocal
            set "EntryUpdate=1"
        )
    ) else (
        if /I "!Line:*:=!" == "!EntryName!=!EntryValue!" (
            endlocal
            goto ValueExists
        )
        if "!Line:*:=!" == "" (
            endlocal
            set /A EmptyLines+=1
        ) else (
            set "Line=!Line:*:=!"
            if "!Line:~0,1!!Line:~-1!" == "[]" (
                echo !EntryName!=!EntryValue!
                if defined EmptyLines for /L %%J in (1,1,!EmptyLines!) do echo(
                echo !Line!
                endlocal
                set "EntryUpdate=3"
                set "CopyLines=1"
            ) else (
                if defined EmptyLines for /L %%L in (1,1,!EmptyLines!) do echo(
                for /F delims^=^=^ eol^= %%J in ("!Line!") do (
                    if /I not "%%~J" == "!EntryName!" (
                        echo !Line!
                        endlocal
                    ) else (
                        echo !EntryName!=!EntryValue!
                        endlocal
                        set "EntryUpdate=2"
                        set "CopyLines=1"
                    )
                )
                set "EmptyLines="
            )
        )
    )
))>"%TempFile%"

if not defined EntryUpdate (
    >>"%TempFile%" echo %SectionName%
    >>"%TempFile%" echo %EntryName%=%EntryValue%
    set EntryUpdate=4
)
if %EntryUpdate% == 1 (
    >>"%TempFile%" echo %EntryName%=%EntryValue%
    set "EntryUpdate=3"
)

move /Y "%TempFile%" %1 2>nul
if errorlevel 1 (
    echo Failed to update: %1>>"%LogFile%"
    del "%TempFile%"
    goto :EOF
)

if %EntryUpdate% == 2 (
    echo Value updated in: %1>>"%LogFile%"
    goto :EOF
)
if %EntryUpdate% == 3 (
    echo Entry added to:   %1>>"%LogFile%"
    goto :EOF
)
if %EntryUpdate% == 4 (
    echo Section+entry to: %1>>"%LogFile%"
    goto :EOF
)

:ValueExists
echo Value existed in: %1>>"%LogFile%"
del "%TempFile%"
goto :EOF

:EndBatch
endlocal

顶部定义的文件相关变量

日志文件在批处理文件的目录中创建,批处理文件名为批处理文件,但文件扩展名为 .log

临时文件是在本地计算机上创建的临时文件目录中的批处理文件名,但文件扩展名为 .tmp

包含计算机名称或 IP 地址的列表文件必须在批处理文件的目录中 PCList.txt

主要代码解释

对于列表文件中不以 ; 开头的每一行,第一个 FOR 循环调用一个子例程,其中包含 INI 文件的完整文件名,以使用适当的更新UNC 路径。行首的分号可用于注释掉计算机名称或 IP 地址。

INI 文件更新例程的要求

编写子程序是为了满足以下要求:

  1. 如果 INI 文件已经包含要用正确部分中的正确值更新的条目,则子程序不应修改 INI 文件。如果文件内容根本没有真正修改,我不喜欢它设置存档属性和修改文件的最后修改日期。
  2. 它应该替换正确部分中与批处理文件顶部定义的值不同的条目值。
  3. 如果该部分已经存在但尚未包含该条目,则应将具有所需值的条目添加到该部分。该条目应添加到该部分的最后一个非空行之后。
  4. 如果文件根本不包含该部分,则应在文件末尾添加该部分和具有所需值的条目。

编写该子例程是为了保留文件中的所有空行,如果只有条目或节和条目必须附加在文件末尾,文件末尾的空行除外。它不添加空行。可以增强它以另外重新格式化 INI 文件,确保除文件顶部之外的部分上方始终恰好有一个空行。

样本文件集

当前目录中有六个文件用于测试,首先使用 FOR 循环以下命令行而不是发布的批处理文件代码中的命令行:

for %%I in (*.ini) do call :UpateIniFile "%%I"

File1.ini 具有部分和条目,但值错误:

[SAMPLE SETTINGS]
SERVER=MYPC
Reboot=0

[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

File2.ini 具有所需值的部分和条目:

[SAMPLE SETTINGS]
SERVER=MYPC
Reboot=1
[SECTION2]
SETTINGX=1234
[SECTION3]
SETTINGX=4567

File3.ini 部分位于顶部,但不包含条目:

[SAMPLE SETTINGS]
SERVER=MYPC
[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

File4.ini 完全缺少该部分:

[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

File5.ini 部分位于末尾,但不包含条目:

[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

[SAMPLE SETTINGS]


SERVER=MYPC

File6.ini 类似于 File1.ini,但此文件设置了只读属性。

示例文件集的结果

批处理文件写入此样本集的日志文件:

Value updated in: "File1.ini"
Value existed in: "File2.ini"
Entry added to:   "File3.ini"
Section+entry to: "File4.ini"
Entry added to:   "File5.ini"
Failed to update: "File6.ini"

File2.iniFile6.ini 根本没有更新。

其他四个文件在批处理文件执行后有如下几行:

File1.ini:

[SAMPLE SETTINGS]
SERVER=MYPC
Reboot=1

[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

File3.ini:

[SAMPLE SETTINGS]
SERVER=MYPC
Reboot=1
[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

File4.ini:

[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567
[SAMPLE SETTINGS]
Reboot=1

File5.ini:

[SECTION2]
SETTINGX=1234

[SECTION3]
SETTINGX=4567

[SAMPLE SETTINGS]


SERVER=MYPC
Reboot=1

所以批处理文件非常适合样本文件集。

INI文件更新例程说明

首先检查是否找到要更新的文件,如果找不到该文件,则会将适当的信息附加到日志文件中。

子例程取消定义下面代码中使用的接下来的三个环境变量。

子例程 UpateIniFile 中使用的 FOR 循环在我对
的回答中有详细解释

FINDSTR 输出的 INI 文件中每一行以行号和冒号开头的行首先分配给环境变量 Line 没有启用延迟扩展以防止行包含感叹号的腐败。

下一个 delayed expansion is enabled which results in creating also a copy of the existing environment variables. Please read lower half of 有关命令 SETLOCALENDLOCAL 的详细信息。了解这两个命令的作用对于理解其余代码非常重要。

第一个 IF 如果应更新值的条目已经在具有所需值的临时文件中,则第一个条件为真,因此文件中的所有剩余行都可以复制到临时文件,无需任何进一步处理。在这种情况下,从文件中读取的行是通过删除行号和由 FINDSTR 添加到该行的冒号输出的。

第二个 IF 如果在批处理文件顶部定义的部分直到当前行都没有找到,则条件为真。在这种情况下,从文件中读取的行也会输出行号和冒号,但会进行额外的不区分大小写的字符串比较,以确定该行是否包含感兴趣的部分。如果找到感兴趣的部分,环境变量 EntryUpdate 将在进入子例程时定义的环境中定义为值 1

否则当前行在感兴趣的部分下方。

如果不带行号和冒号的这一行不区分大小写,等于要用所需值更新的条目,则可以停止对行的处理,因为文件包含已具有所需值的条目。命令 GOTO 用于退出 FOR 循环并继续批处理标签 ValueExists 下面的批处理文件,其中删除了临时文件在离开子例程之前,该值已存在于当前文件中的信息被写入日志文件。

如果感兴趣的部分中没有行号和冒号的行是空行,环境变量EmptyLines将在进入子例程时定义的先前环境中递增1。值 0 用于 EmptyLines 未定义,如命令 SET 的帮助所述。感兴趣的部分没有其他在线操作是空行。

对于感兴趣部分中的非空行,首先重新定义环境变量 Line,删除行号和冒号,以便于进一步处理该行。

下一个条件比较区分大小写的用双引号括起来的行的第一个和最后一个字符与字符串 "[]" 以查明该行是否是新部分的开始。如果此条件为真,则感兴趣的部分根本不包含该条目。因此,现在输出具有所需值的条目,接下来可能在新部分尚未输出之前找到所有空行。然后输出带有新部分的行,在进入子程序时定义的环境中,环境变量 EntryUpdate 被重新定义为字符串值 3,环境变量 CopyLines 被定义为所有其他行文件现在可以直接复制到临时文件。

但如果当前行不是一个新的节,它是感兴趣节中的非空行。它可能是其值不是所需值或不同条目的条目的行。因此首先首先输出所有空行,这些空行可能在感兴趣部分的当前输入行之上。

下一个命令 FOR 用于拆分当前行并分配给循环变量 J 字符串左边第一个等号(零之后或行首的更多等号,希望 INI 文件永远不会包含)。

如果感兴趣部分的当前行不区分大小写而不是应更新其值的条目,则仅输出条目行。否则会找到要更新的条目行,因此在使用字符串值 2 重新定义环境变量 EntryUpdate 并且环境变量 CopyLines 为定义为将所有其他行简单地复制到临时文件。

FOR 循环中处理 INI 文件行的所有输出都被重定向到临时文件中。

可能是当前 INI 文件根本不包含感兴趣的部分,这可以在处理所有行后通过检查环境变量 EntryUpdate 是否仍未定义来发现。在这种情况下,具有所需值的部分和条目将附加到临时文件,忽略环境变量 EmptyLines 以忽略 INI 文件底部的所有空行。

也有可能 INI 文件中的最后一个部分是感兴趣的部分,但是直到文件末尾都没有找到具有要更新的值的条目。因此,另一个 IF 条件用于检查是否有必要在文件末尾附加具有所需值的条目行,而忽略文件末尾的所有空行。

现在临时文件包含刚刚处理的INI文件在完成批处理文件执行后应该包含的行。因此,如果临时文件不是只读的或未受文件权限写保护或未受文件访问权限写保护,因为当前正由使用此 INI 文件的应用程序打开,则将临时文件移动到 INI 文件目录并替换 INI 文件。

如果当前的 INI 文件不能用想要的修改替换,临时文件将被删除,并将此错误情况记录在日志文件中。否则,当前 INI 文件已成功更新,并记录在日志文件中,其中包含批处理文件如何完成更新的信息。

附加信息

现在应该清楚 Windows 命令处理器不是为修改文件内容而设计的,因为它是为 运行 命令和可执行文件设计的。有很多脚本解释器比 cmd.exe.

更适合此任务

为了了解使用的命令及其工作原理,请打开 command prompt window,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • move /?
  • set /?
  • setlocal /?

另请参阅:

我得到了什么:

@echo off
setlocal EnableExtensions Disabledelayedexpansion
set TODAY=%Date:~4,2%-%Date:~7,2%-%Date:~10,4%
set Target=SMSStart.ini
set SectionName=[Maintenance]
set EntryName=Reboot
set EntryValue=1
set LogFile=./INI_VAL_CHANGE_%TODAY%_Log.txt
set TempFile=%TEMP%\%~n0.tmp
set ListFile=PCList.txt

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

XCOPY /Y %~dp0*_log.txt %~dp0%LOGS>nul
ERASE %~dp0*_log.txt /Q

Echo PC list: %ListFile% 
Echo Run: %DATE%:%TIME%
Echo PC list: %ListFile%>>%LogFile%
Echo Run: %DATE%:%TIME%>>%LogFile%
Echo Target File: %Target%
Echo Target File: %Target%>>%LogFile%
Echo Search Key: %EntryName%= Update: "%EntryName%=%EntryValue%"
Echo Search Key: %EntryName%= Update: "%EntryName%=%EntryValue%">>%LogFile%
Echo =============================
Echo =============================>>%LogFile%

for /F "usebackq delims=" %%I in ("%ListFile%") do call :UpateIniFile "\%%I\Storeman\%Target%"
goto EndBatch

:UpateIniFile
set "EmptyLines="
set "EntryUpdate="
set "CopyLines="
(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" %1 2^>nul') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    if defined CopyLines (
        echo(!Line:*:=!
        endlocal
    ) else if not defined EntryUpdate (
        echo(!Line:*:=!
        if /I "!Line:*:=!" == "!SectionName!" (
            endlocal
            set "EntryUpdate=1"
        )
    ) else (
        if /I "!Line:*:=!" == "!EntryName!=!EntryValue!" (
            endlocal
            goto ValueExists
        )
        if "!Line:*:=!" == "" (
            endlocal
            set /A EmptyLines+=1
        ) else (
            set "Line=!Line:*:=!"
            if "!Line:~0,1!!Line:~-1!" == "[]" (
                echo !EntryName!=!EntryValue!
                if defined EmptyLines for /L %%J in (1,1,!EmptyLines!) do echo(
                echo !Line!
                endlocal
                set "EntryUpdate=3"
                set "CopyLines=1"
            ) else (
                if defined EmptyLines for /L %%L in (1,1,!EmptyLines!) do echo(
                for /F delims^=^=^ eol^= %%J in ("!Line!") do (
                    if /I not "%%~J" == "!EntryName!" (
                        echo !Line!
                        endlocal
                    ) else (
                        echo !EntryName!=!EntryValue!
                        endlocal
                        set "EntryUpdate=2"
                        set "CopyLines=1"
                    )
                )
                set "EmptyLines="
            )
        )
    )
))>"%TempFile%"

if not defined EntryUpdate (
    >>"%TempFile%" echo %SectionName%
    >>"%TempFile%" echo %EntryName%=%EntryValue%
    set EntryUpdate=4
)
if %EntryUpdate% == 1 (
    >>"%TempFile%" echo %EntryName%=%EntryValue%
    set "EntryUpdate=3"
)

move /Y "%TempFile%" %1 2>nul
if errorlevel 1 (
    echo Failed to update: %1 : !time:~0,8!
    echo Failed to update: %1 : !time:~0,8!>>"%LogFile%"
    del "%TempFile%"
    goto :EOF
)

if %EntryUpdate% == 2 (
    echo !EntryName!=!EntryValue! updated in: %1 : !time:~0,8! 
    echo !EntryName!=!EntryValue! updated in: %1 : !time:~0,8!>>"%LogFile%"
    goto :EOF
)
if %EntryUpdate% == 3 (
    echo !EntryName!=!EntryValue! added to:   %1 : !time:~0,8!
    echo !EntryName!=!EntryValue! added to:   %1 : !time:~0,8!>>"%LogFile%"
    goto :EOF
)
if %EntryUpdate% == 4 (
    echo Section+ !EntryName!=!EntryValue! to: %1 : !time:~0,8!
    echo Section+ !EntryName!=!EntryValue! to: %1 : !time:~0,8!>>"%LogFile%"
    goto :EOF
)

:ValueExists
    echo !EntryName!=!EntryValue! existed in: %1 : !time:~0,8!
    echo !EntryName!=!EntryValue! existed in: %1 : !time:~0,8!>>"%LogFile%"
    del "%TempFile%"
    goto :EOF

:EndBatch
endlocal
pause

@Mofi - 尝试根据您的建议加强代码:

move /Y "%TempFile%" %1 2>nul
if errorlevel 1 (
    echo Failed to update: %1 : !time:~0,8!
    echo Failed to update: %1 : !time:~0,8!>>"%LogFile%"
    del "%TempFile%"
    goto :EOF

试图找出为什么当批处理无法到达网络上的 PC 并输出错误级别 1 时,脚本 returns !time:~0,8!而不是实际的时间戳?

这是我正在使用的当前版本:

@echo off
setlocal EnableExtensions Disabledelayedexpansion
set "TODAY=%Date:~4,2%-%Date:~7,2%-%Date:~10,4%"
set "Target=SMSStart.ini"
set "TarDIR=Storeman"
set "SectionName=[Maintenance]"
set "EntryName=Reboot"
set "EntryValue=1"
set "LogFile=.\INI_VAL_CHANGE_%TODAY%_Log.txt"
set "TempFile=%TEMP%\%~n0.tmp"
set "ListFile=PCList.txt"

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

XCOPY /Y "%~dp0*_log.txt" %~dp0%LOGS>nul
ERASE "%~dp0*_log.txt" /Q
Echo INI File Updater
Echo INI File Updater>>%LogFile%
Echo ==============================
Echo ==============================>>%LogFile%
Echo PC list: %ListFile% 
Echo Run: %DATE%:%TIME%
Echo PC list: %ListFile%>>%LogFile%
Echo Run: %DATE%:%TIME%>>%LogFile%
Echo Target File: %Target%
Echo Target File: %Target%>>%LogFile%
Echo Target DIR: \%TarDIR%
Echo Target DIR: \%TarDIR%>>%LogFile%
Echo INI Section : %SectionName%
Echo INI Section : %SectionName%>>%LogFile%
Echo Search Key: %EntryName%= Update: "%EntryName%=%EntryValue%"
Echo Search Key: %EntryName%= Update: "%EntryName%=%EntryValue%">>%LogFile%
Echo ==============================
Echo.
Echo ==============================>>%LogFile%
Echo.>>%LogFile%

for /F "usebackq delims=" %%I in ("%ListFile%") do call :UpateIniFile "\%%I\%TarDIR%\%Target%"
goto EndBatch

:UpateIniFile
set "EmptyLines="
set "EntryUpdate="
set "CopyLines="
(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" %1 2^>nul') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    if defined CopyLines (
        echo(!Line:*:=!
        endlocal
    ) else if not defined EntryUpdate (
        echo(!Line:*:=!
        if /I "!Line:*:=!" == "!SectionName!" (
            endlocal
            set "EntryUpdate=1"
        )
    ) else (
        if /I "!Line:*:=!" == "!EntryName!=!EntryValue!" (
            endlocal
            goto ValueExists
        )
        if "!Line:*:=!" == "" (
            endlocal
            set /A EmptyLines+=1
        ) else (
            set "Line=!Line:*:=!"
            if "!Line:~0,1!!Line:~-1!" == "[]" (
                echo !EntryName!=!EntryValue!
                if defined EmptyLines for /L %%J in (1,1,!EmptyLines!) do echo(
                echo !Line!
                endlocal
                set "EntryUpdate=3"
                set "CopyLines=1"
            ) else (
                if defined EmptyLines for /L %%L in (1,1,!EmptyLines!) do echo(
                for /F delims^=^=^ eol^= %%J in ("!Line!") do (
                    if /I not "%%~J" == "!EntryName!" (
                        echo !Line!
                        endlocal
                    ) else (
                        echo !EntryName!=!EntryValue!
                        endlocal
                        set "EntryUpdate=2"
                        set "CopyLines=1"
                    )
                )
                set "EmptyLines="
            )
        )
    )
))>"%TempFile%"

if not defined EntryUpdate (
    >>"%TempFile%" echo %SectionName%
    >>"%TempFile%" echo %EntryName%=%EntryValue%
    set EntryUpdate=4
)
if %EntryUpdate% == 1 (
    >>"%TempFile%" echo %EntryName%=%EntryValue%
    set "EntryUpdate=3"
)

move /Y "%TempFile%" %1 2>nul
if errorlevel 1 (
    echo Failed to update: %1 : !time:~0,8!
    echo Failed to update: %1 : !time:~0,8!>>"%LogFile%"
    del "%TempFile%"
    goto :EOF
)

if %EntryUpdate% == 2 (
    echo !EntryName!=!EntryValue! updated in: %1 : !time:~0,8! 
    echo !EntryName!=!EntryValue! updated in: %1 : !time:~0,8!>>"%LogFile%"
    goto :EOF
)
if %EntryUpdate% == 3 (
    echo !EntryName!=!EntryValue! added to:   %1 : !time:~0,8!
    echo !EntryName!=!EntryValue! added to:   %1 : !time:~0,8!>>"%LogFile%"
    goto :EOF
)
if %EntryUpdate% == 4 (
    echo Section+ !EntryName!=!EntryValue! to: %1 : !time:~0,8!
    echo Section+ !EntryName!=!EntryValue! to: %1 : !time:~0,8!>>"%LogFile%"
    goto :EOF
)

:ValueExists
    echo !EntryName!=!EntryValue! existed in: %1 : !time:~0,8!
    echo !EntryName!=!EntryValue! existed in: %1 : !time:~0,8!>>"%LogFile%"
    del "%TempFile%"
    goto :EOF

:EndBatch
Echo.
Echo.>>%LogFile%
Echo ---COMPLETE---
Echo ---COMPLETE--->>"%LogFile%"
Echo.
endlocal
pause