循环批处理-程序退出-Reg查询-Win 7



问题:以下批处理程序在尝试运行第一个for循环时退出,而%file3% txt文件只有:

Displayname 
------------- 

需要关于for循环不工作的原因的建议。

REG查询在文本文件中循环的第一个部分输出:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallAdobe AIR
DisplayName    REG_SZ    Adobe AIR
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallCisco AnyConnect Secure Mobility Client
DisplayName    REG_SZ    Cisco AnyConnect Secure Mobility Client 
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallCitrixOnlinePluginPackWeb
DisplayName    REG_SZ    Citrix Receiver
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallKLiteCodecPack_is1
DisplayName    REG_SZ    K-Lite Codec Pack 10.7.5 Basic
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallMobile Broadband HL Service
DisplayName    REG_SZ    Mobile Broadband HL Service

%file3%:中的所需输出

Displayname
-------------
Adobe AIR
Cisco AnyConnect Secure Mobility Client
Citrix Receiver
K-Lite Codec Pack 10.7.5 Basic
Mobile Broadband HL Service

批次代码:

@echo OFF
setlocal enableextensions enabledelayedexpansion 
set "Version_tool=v2"
Echo Version: %Version_tool%
Echo Modified 19/01/15 by xxx
SET "ComputerName=%computername%"
echo ComputerName is: %ComputerName%
SET "file3=%~dp0%computername%-programs_unsorted.txt"
echo File3 is: %file3%
If Exist %file3% Del %file3%
echo Displayname >> %file3%
echo ------------- >> %file3%
set "keyname=HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall"
echo keyname is: !keyname!
Rem === Problem is below - program exits when running for loop ===
For /f "usebackq tokens=* delims=" %%A in (`REG Query "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall" /V /F DisplayName /S /E`) do (
pause
set "DisplayName=%%A"
echo DisplayName is: !Displayname!
pause
set "Display_Substring=!DisplayName:~0,71!"
echo Display_Substring is: !Display_Substring!
pause
if not "!DisplayName:HKEY_LOCAL_MACHINE=!"=="!DisplayName!" echo !DisplayName! >> %file3%
::if !DisplayName:~0,71!==HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall (
::  echo skipping !DisplayName!
::) else (
::  echo !DisplayName! >> %file3%
::)
)

问题:

1( 您指定了usebackq,但使用了单引号,因此FOR/F处理字符串而不是命令。丢弃usebackq,循环将正确处理该命令。我唯一一次使用usebackq是在读取路径必须加引号的文件时,通常是因为空格。

2( 你的IF声明一团糟:

  • 您的命令使用正常展开而不是延迟展开,因此无法看到循环中设置的值。

  • 您使用了=,但比较运算符是==

  • 在IF语句中使用延迟扩展子字符串操作时,应在比较的两边引用值,否则必须转义逗号。我推荐报价(实际上你根本不需要IF(

if "!DisplayName:~1,71!"=="yourValue..."

3( 您希望排除输出的摘要行。最简单的解决方案是通过管道将输出发送到FIND或FINDSTR,并让它过滤掉您不想要的行。管道运算符必须在IN((子句中转义。

4( 您可以让FOR/F解析出列(标记(。您需要第三列,其中包含空格。前面的列都不包含空格,因此可以使用tokens=2*,这意味着在第一个变量中捕获第二个令牌,并在第二个变量中保留之后的所有内容。

for /f "tokens=2*" %%A in (
  'REG Query "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall" /V /F DisplayName /S /E^|find "DisplayName"'
) do echo %%B>>"%file3%"

最新更新