【问题标题】:why does this loop twice for the 32bit system?为什么这个循环两次对于 32 位系统?
【发布时间】:2014-02-04 20:42:31
【问题描述】:

所以我想要完成的是:

1) 从计算机列表中读取

2) 确定它是 Windows 的哪一部分(参见下面的 reg 键)

3) 转到相应的if 语句并删除键(如果存在)。

它在 64 位系统上运行得非常好,但由于某种原因,当它遇到 32 位系统(没有 \Wow6432Node\ 的系统)时,它会循环两次并称之为 64 位系统。我很困惑为什么它会这样做。

这是我正在使用的最新代码,旧版本有set regkey1_32=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\00002109A10000000000000000F01FEC\InstallProperties

:32_1 echo %1 is 32bit >> "C:\Outlook\RegeditList.txt" REG QUERY \\%1\%regkey1_32% > nul

所以我可能需要一些新的眼光来看看我不知道的东西。

OVLK.txt 包含计算机名称,因此无论您在其中放入什么 (MJGXGTH(x64)\34ZXYC1(x86)) 都无关紧要。日志文件输出在底部。

@echo off
for /F "tokens=1 delims="  %%i in (C:\Outlook\OVLK.txt) do call :proccheck %%i
goto EOF

:proccheck
REG QUERY \\%1\%proctype% 2>nul >nul
if %errorlevel% == 0 (
    goto :64_1
    ) else (
    goto :32_1 )

:32_1
echo %1 is 32bit >> "C:\Outlook\RegeditList.txt" 
REG QUERY \\%1\%regkey1_64% > nul
if %errorlevel%== 0  (
    echo %regkey1_64% Found! >> "C:\Outlook\RegeditList.txt" 
    REG DELETE \\%1\%regkey1_64% /f >> "C:\Outlook\RegeditList.txt" 
    goto :32_2
    ) else (
    echo %regkey1_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    goto :32_2 )
:32_2
REG QUERY \\%1\%regkey2_32% > nul
if %errorlevel%== 0 (
    echo %regkey2_32% Found! >> "C:\Outlook\RegeditList.txt" 
    REG DELETE \\%1\%regkey2_32% /f >> "C:\Outlook\RegeditList.txt"
    goto :32_3
    ) else (
    echo %regkey2_32% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    goto :32_3 )

:32_3
REG QUERY \\%1\%regkey3_32% > nul
if %errorlevel%== 0 (
    echo %regkey3_32% Found! >> "C:\Outlook\RegeditList.txt" 
    REG DELETE \\%1\%regkey3_32% /f >> "C:\Outlook\RegeditList.txt"
    echo. >> "C:\Outlook\RegeditList.txt"
    ) else (
    echo %regkey3_32% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    echo. >> "C:\Outlook\KeysNotFoundlist.txt"
    echo. >> "C:\Outlook\RegeditList.txt" )
echo Checked %1 now going to loop! >> "C:\Outlook\RunLog.log"
echo. >> "C:\Outlook\RunLog.log"

:64_1
echo %1 is 64bit >> "C:\Outlook\RegeditList.txt" 
REG QUERY \\%1\%regkey1_64% > nul
if %errorlevel%== 0  (
    echo %regkey1_64% Found! >> "C:\Outlook\RegeditList.txt" 
    REG DELETE \\%1\%regkey1_64% /f >> "C:\Outlook\RegeditList.txt" 
    goto :64_2
    ) else (
    echo %regkey1_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    goto :64_2 )

:64_2
REG QUERY \\%1\%regkey2_64% > nul
if %errorlevel%== 0 (
    echo %regkey2_64% Found! >> "C:\Outlook\RegeditList.txt" 
    REG DELETE \\%1\%regkey2_64% /f >> "C:\Outlook\RegeditList.txt"
    goto :64_3
    ) else (
    echo %regkey2_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    goto :64_3 )

:64_3
REG QUERY \\%1\%regkey3_64% > nul
if %errorlevel%== 0 (
    echo %regkey3_64% Found! >> "C:\Outlook\RegeditList.txt" 
    REG DELETE \\%1\%regkey3_64% /f >> "C:\Outlook\RegeditList.txt"
    echo. >> "C:\Outlook\RegeditList.txt"
    ) else (
    echo %regkey3_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    echo. >> "C:\Outlook\KeysNotFoundlist.txt"
    echo. >> "C:\Outlook\RegeditList.txt" )     
  echo Checked %1 now going to loop! >> "C:\Outlook\RunLog.log"
  echo. >> "C:\Outlook\RunLog.log"
    :EOF

RunLog.log

Checked MJGXGTH now going to loop!
Checked 34ZXYC1 now going to loop! 
Checked 34ZXYC1 now going to loop!

RegeditList.txt

MJGXGTH is 64bit  
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\00002109A10000000000000000F01FEC\InstallProperties Found!
The Operation Completed Successfully
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Registration\{90120000-001A-0000-0000-0000000FF1CE} Found!
The Operation Completed Successfully
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\OUTLOOK Found!
The Operation Completed Successfully 

34ZXYC1 is 32bit  
 Found!  
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration\{90120000-001A-0000-0000-0000000FF1CE} Found!  
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OUTLOOK Found!  

34ZXYC1 is 64bit  
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\00002109A10000000000000000F01FEC\InstallProperties Found!  

KeysNotFoundList.txt

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Registration\{90120000-001A-0000-0000-0000000FF1CE} not found on: 34ZXYC1 - Check 
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\OUTLOOK not found on: 34ZXYC1 - Check 

如果您需要更多信息,请告诉我!

【问题讨论】:

  • 也许你可以指出循环两次的代码,而不是用一堵代码墙打我们,让我们先搞清楚?
  • 抱歉,见上文。但是第一次从for 读取 34zxyc1 时很棒,但是当文件中只有一个实例时会再次调用它
  • 所以它发生在上面的第二行代码中,就在@echo off之后?
  • 是的,但是一旦到达 :proccheck,它就会进入 64 面,据我所知,XP 在注册表中的任何地方都没有 Wow6432Node....

标签: batch-file registry batch-processing remote-access regedit


【解决方案1】:

(截至 2014 年 2 月 4 日东部标准时间 17:00)您未能显示所有相关代码 - 特别是生成 RunLog.Log 的代码。

您显示的代码使用goto :32_2goto :64_2,但您没有显示这些标签或其代码。标签:32_2 之后的代码很可能缺少goto :eof(或exit /b)。

无论如何,逻辑错误都在未显示的代码中。


针对现在有问题的完整代码更新了答案

正如我所怀疑的那样 - 您没有在 :32_3 代码部分之后放置 GOTO :EOF,所以它只是落入了 :64_1 部分。

您应该使用GOTO :EOF 而不是GOTO EOF - 这样您就不需要在脚本末尾添加明确的:EOF 标签。另一种选择是简单地使用 EXIT /B 代替 - 它与 GOTO :EOF 完全相同。

您可以消除大部分标签,因为每个 IF 语句的 TRUE 和 FALSE 都转到相同的标签。您可以简单地让代码落入下一段代码而无需任何 GOTO。

此外,您的第一个 IF 的 ELSE 并不是真正需要的。当它不是 :64 时,它也可以简单地落入 :32 部分

@echo off
for /F "tokens=1 delims="  %%i in (C:\Outlook\OVLK.txt) do call :proccheck %%i
exit /b

:proccheck
REG QUERY \\%1\%proctype% 2>nul >nul
if %errorlevel% == 0 goto :64

:32 (Note - this label isn't needed, but I preserved it for documentation purposes)
echo %1 is 32bit >> "C:\Outlook\RegeditList.txt"
REG QUERY \\%1\%regkey1_64% > nul
if %errorlevel%== 0  (
  echo %regkey1_64% Found! >> "C:\Outlook\RegeditList.txt"
  REG DELETE \\%1\%regkey1_64% /f >> "C:\Outlook\RegeditList.txt"
) else (
  echo %regkey1_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
)
REG QUERY \\%1\%regkey2_32% > nul
if %errorlevel%== 0 (
  echo %regkey2_32% Found! >> "C:\Outlook\RegeditList.txt"
  REG DELETE \\%1\%regkey2_32% /f >> "C:\Outlook\RegeditList.txt"
) else (
  echo %regkey2_32% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
)
REG QUERY \\%1\%regkey3_32% > nul
if %errorlevel%== 0 (
  echo %regkey3_32% Found! >> "C:\Outlook\RegeditList.txt"
  REG DELETE \\%1\%regkey3_32% /f >> "C:\Outlook\RegeditList.txt"
  echo. >> "C:\Outlook\RegeditList.txt"
) else (
  echo %regkey3_32% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
  echo. >> "C:\Outlook\KeysNotFoundlist.txt"
  echo. >> "C:\Outlook\RegeditList.txt"
)
echo Checked %1 now going to loop! >> "C:\Outlook\RunLog.log"
echo. >> "C:\Outlook\RunLog.log"
exit /b

:64
echo %1 is 64bit >> "C:\Outlook\RegeditList.txt"
REG QUERY \\%1\%regkey1_64% > nul
if %errorlevel%== 0  (
  echo %regkey1_64% Found! >> "C:\Outlook\RegeditList.txt"
  REG DELETE \\%1\%regkey1_64% /f >> "C:\Outlook\RegeditList.txt"
) else (
  echo %regkey1_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
)
REG QUERY \\%1\%regkey2_64% > nul
if %errorlevel%== 0 (
  echo %regkey2_64% Found! >> "C:\Outlook\RegeditList.txt"
  REG DELETE \\%1\%regkey2_64% /f >> "C:\Outlook\RegeditList.txt"
) else (
  echo %regkey2_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
)
REG QUERY \\%1\%regkey3_64% > nul
if %errorlevel%== 0 (
  echo %regkey3_64% Found! >> "C:\Outlook\RegeditList.txt"
  REG DELETE \\%1\%regkey3_64% /f >> "C:\Outlook\RegeditList.txt"
  echo. >> "C:\Outlook\RegeditList.txt"
) else (
  echo %regkey3_64% not found on: %1 - Check >> "C:\Outlook\KeysNotFoundlist.txt"
  echo. >> "C:\Outlook\KeysNotFoundlist.txt"
  echo. >> "C:\Outlook\RegeditList.txt"
)
echo Checked %1 now going to loop! >> "C:\Outlook\RunLog.log"
echo. >> "C:\Outlook\RunLog.log"
exit /b

另一种选择是使用&& 运算符在前一个命令成功时有条件地执行代码,如果前一个命令失败,则使用|| 有条件地执行代码。您根本不需要任何 CALL 或 GOTO。

@echo off
for /F "tokens=1 delims="  %%i in (C:\Outlook\OVLK.txt) do (
  REG QUERY \\%%i\%proctype% 2>nul >nul && (
    REM 64 section
    echo %%i is 64bit >> "C:\Outlook\RegeditList.txt"
    REG QUERY \\%%i\%regkey1_64% > nul && (
      REG DELETE \\%%i\%regkey1_64% /f >> "C:\Outlook\RegeditList.txt"
      echo %regkey1_64% Found! >> "C:\Outlook\RegeditList.txt"
    ) || (
      echo %regkey1_64% not found on: %%i - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    )
    REG QUERY \\%%i\%regkey2_64% > nul && (
      REG DELETE \\%%i\%regkey2_64% /f >> "C:\Outlook\RegeditList.txt"
      echo %regkey2_64% Found! >> "C:\Outlook\RegeditList.txt"
    ) || (
      echo %regkey2_64% not found on: %%i - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    )
    REG QUERY \\%%i\%regkey3_64% > nul && (
      echo %regkey3_64% Found! >> "C:\Outlook\RegeditList.txt"
      REG DELETE \\%%i\%regkey3_64% /f >> "C:\Outlook\RegeditList.txt"
      echo. >> "C:\Outlook\RegeditList.txt"
    ) || (
      echo %regkey3_64% not found on: %%i - Check >> "C:\Outlook\KeysNotFoundlist.txt"
      echo. >> "C:\Outlook\KeysNotFoundlist.txt"
      echo. >> "C:\Outlook\RegeditList.txt"
    )
    echo Checked %%i now going to loop! >> "C:\Outlook\RunLog.log"
    echo. >> "C:\Outlook\RunLog.log"
  ) || (
    REM 32 section
    echo %%i is 32bit >> "C:\Outlook\RegeditList.txt"
    REG QUERY \\%%i\%regkey1_64% > nul && (
      REG DELETE \\%%i\%regkey1_64% /f >> "C:\Outlook\RegeditList.txt"
      echo %regkey1_64% Found! >> "C:\Outlook\RegeditList.txt"
    ) || (
      echo %regkey1_64% not found on: %%i - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    )
    REG QUERY \\%%i\%regkey2_32% > nul && (
      REG DELETE \\%%i\%regkey2_32% /f >> "C:\Outlook\RegeditList.txt"
      echo %regkey2_32% Found! >> "C:\Outlook\RegeditList.txt"
    ) || (
      echo %regkey2_32% not found on: %%i - Check >> "C:\Outlook\KeysNotFoundlist.txt"
    )
    REG QUERY \\%%i\%regkey3_32% > nul && (
      echo %regkey3_32% Found! >> "C:\Outlook\RegeditList.txt"
      REG DELETE \\%%i\%regkey3_32% /f >> "C:\Outlook\RegeditList.txt"
      echo. >> "C:\Outlook\RegeditList.txt"
    ) || (
      echo %regkey3_32% not found on: %%i - Check >> "C:\Outlook\KeysNotFoundlist.txt"
      echo. >> "C:\Outlook\KeysNotFoundlist.txt"
      echo. >> "C:\Outlook\RegeditList.txt"
    )
    echo Checked %%i now going to loop! >> "C:\Outlook\RunLog.log"
    echo. >> "C:\Outlook\RunLog.log"
  )
)

【讨论】:

  • 现在看完整代码,上面的人想要更精确的代码sn-ps
  • @Benny - 好的,诊断完成 - 请参阅更新的答案。
  • 啊哈!我认为如果您使用标签,那么脚本在被调用之前不会处理它们,但这是有道理的,在 :32 之后我需要结束它,就好像它是一个独立的脚本一样。谢谢德本汉姆!
  • @Benny - 您的:32_1 部分引用了%regkey1_64%。这是故意的吗?它不符合您其余代码的模式。
  • 是的。 %regkey1_64%%regkey1_32 的位置相同,设置 2 个具有相同位置的变量没有意义。
猜你喜欢
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多