繁体   English   中英

未定义来自FOR LOOP批次的变量携带信息

[英]Not defined variable carrying info from FOR LOOP batch

目的:了解如何在批处理文件的FOR LOOP例程中使用空变量。

问题:我正在使用是否定义变量来确定脚本中适当的子例程; 2个定义的变量==去做某事。 一个已定义,但另一个==未定义。 两者都未定义==再次出现。

该脚本检查C $访问以及联网PC的文本文件列表的C $中是否存在某些文件。 如果两个具有数据集的变量都满足这两个条件,则简单的xcopy会通过转到某个子例程来更新有问题的文件,然后LOOP移至网络上的下一个PC进行尝试。

如果有问题,我想使用空状态的变量来执行其他操作; 例如,向文本文件报告无法访问c $或缺少该文件,则表示安装错误等。

但是,在我的2台测试机上,我打破了文件夹路径以启动错误报告例程,并发现一些奇怪的问题,如果不编写更多行代码就无法解决。 在我的文本文件中,我列出了2台PC,例如

PC1 PC2 PC1 PC2 PC1 PC2

PC1的文件路径损坏,无法测试错误记录PC2的所有文件都可以测试文件更新过程

当我运行脚本时,PC1被报告存在问题并正确记录。 PC2一切正常,并且更新进行得很好。 但是,然后它再次命中PC1,但似乎认为[即使文件路径仍然损坏]也可以-好像从上一个循环中记住了该变量,并且当然尝试更新并出现了问题。

这是我尝试使用空变量开始工作的代码

@echo off
color 0E
pushd %~dp0
setlocal EnableDelayedExpansion

for /f "usebackq tokens=*" %%i in ("%~dp0hostnames.txt") do (

rem Test Access Admin Shares C$
if exist "\\%%i\C$\Windows\System32" set dollar=yes

rem Test Installation Integrity
if exist "\\%%i\C$\ProgramData\config.cfg" set install=ok

echo %%i
echo !dollar!
echo !install!
pause

IF !dollar!==yes IF !install!==ok (call :updatecfg %%i)

IF !dollar!==yes IF [!install!]==[] (call :installerror %%i)

IF [!dollar!]==[] (call :errorshare %%i)
)
echo THE END
pause
exit

:updatecfg
CLS
XCOPY "%~dp0config.cfg" /Y "\\%1\C$\ProgramData" & echo %1 Update Config.cfg Succeeded! & echo %1 Update Succeeded! >>"%~dp0logpass.txt" 
ping 127.0.0.1 -n 3 >nul
goto :eof

:errorshare
CLS
echo.
echo    %1 Has C$ Access Issues [Logging] & echo %1 Has C$ Access Issues >>"%~dp0logfail.txt"
ping 127.0.0.1 -n 3 >nul
goto :eof

:installerror
CLS
echo.
echo    %1 Cannot Find Config.cfg^!^! [Logging] & echo %1 Cannot Find Config.cfg^!^! Not Installed or Configured^? >>"%~dp0logfail.txt"
ping 127.0.0.1 -n 4 >nul
goto :eof

如果我在开始时将不存在项添加为2,并在出现问题时让它们进行设置,则此方法可以正常工作。 但是我想知道这是执行此操作的正确方法还是应该也可以使用空变量。 我几乎在那儿,只是他们没有正确清除每个循环。

非常感谢。

....
for /f "usebackq delims=" %%i in ("%~dp0hostnames.txt") do (
    rem Clear variables for each iteration
    set "dollar="
    set "install="

    rem Test Access Admin Shares C$
    if exist "\\%%i\C$\Windows\System32" set "dollar=yes"

    rem Test Installation Integrity
    if exist "\\%%i\C$\ProgramData\config.cfg" set "install=ok"

    if defined dollar (
        if defined install (
            call :updatecfg %%i
        ) else (
            call :installerror %%i
        )
    ) else (
        call :errorshare %%i
    )
)
....

要么

....
for /f "usebackq delims=" %%i in ("%~dp0hostnames.txt") do (

    rem Test Access Admin Shares C$
    if exist "\\%%i\C$\Windows\System32"  ( set "dollar=yes" ) else ( set "dollar=" )

    rem Test Installation Integrity
    if exist "\\%%i\C$\ProgramData\config.cfg" ( set "install=ok" ) else ( set "install=" )

    if defined dollar (
        if defined install (
            call :updatecfg %%i
        ) else (
            call :installerror %%i
        )
    ) else (
        call :errorshare %%i
    )
)
....

无论如何,在基于变量的内容进行决策之前,应确保变量具有已赋值的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM