【问题标题】:Not defined variable carrying info from FOR LOOP batch未定义变量携带来自 FOR LOOP 批处理的信息
【发布时间】:2017-03-16 17:48:31
【问题描述】:

目标: 了解如何在批处理文件的 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

如果我在开始时添加 if not exist 到 2 并让他们在出现问题时设置一些东西,那么这很好。但我想知道这是否是正确的方法,或者我是否也应该能够使用空变量。我快到了,只是他们没有在每个循环中正确清除。

非常感谢。

【问题讨论】:

  • if exist "\\%%i\C$\Windows\System32" (set "dollar=yes") else (set "dollar=")。此外,您应该使用IF "!dollar!"=="yes" ... 语法以避免语法错误(当!dollar! 为空时)
  • 更新原帖...
  • 请不要在您的问题的脚本中实现解决方案,因为那样线程不再有意义,特别是对于任何新访问者;如果您真的希望显示脚本的最终功能版本,请发布您自己的答案...

标签: loops batch-file variables for-loop


【解决方案1】:
....
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
    )
)
....

在任何情况下,您都应确保变量具有适当的值,然后再根据其内容做出决定。

【讨论】:

  • 这正是我所需要的。现在我知道我需要在这种脚本中清除/重置变量。也有几种方法!我刚刚在开始时添加了 Set "dollar=" & set "install="。更新了 OP。
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多