【发布时间】: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