目的: 了解如何在批处理文件中的FOR LOOP例程中使用空变量。
问题: 我正在使用是否定义变量来确定我的脚本中的相应子例程;定义了2个变量==去做点什么。一个是定义但不是另一个==做其他事情。两者都没有定义==别的东西。
脚本检查C $访问以及联网PC文本文件列表的C $中是否存在某个文件。如果具有数据集的2个变量满足两个条件,则简单的xcopy通过转到某个子例程来更新有问题的文件,然后LOOP移动到网络上的下一个PC以尝试执行相同操作。
如果有问题,我想在空状态下使用变量,然后再做其他事情;例如,向文本文件报告c $无法访问或文件丢失意味着安装不正确等。
然而,在我的2台测试机器上,我正在打破文件夹路径以触发错误报告例程并找到一些奇怪的东西我无法修复而无需编写更多代码行。在我的文本文件中,我有两次列出的PC,例如。
PC1 PC2 PC1 PC2 PC1 PC2
PC1有一个损坏的文件路径来测试错误记录 PC2可以很好地测试文件更新过程
当我运行脚本时,PC1报告有问题并正确记录。 PC2一切都很好,更新很顺利。然后它再次击中PC1,但似乎认为[即使文件路径仍然被破坏]它是好的 - 如果变量是从前一个循环中记住的,当然会尝试更新并且有问题。
以下是我尝试使用空变量
开始工作的代码REPLACE((datetime)ToDate('$current__ts', 'yyyy-MM-dd HH:mm:ss'),'-','') as new_DT,
如果我添加如果不存在,则在开始时将其委托给2,并在出现问题时让它们设置,然后这样可以正常工作。但我想知道这是否是正确的方法,或者我是否也可以使用空变量。我几乎就在那里,只是他们没有在每个循环中正确清理。
非常感谢。
答案 0 :(得分: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
)
)
....
在任何情况下,您都应确保变量具有适当的值,然后才能根据其内容做出决定。