问题:下面的批处理程序在尝试运行第一个for循环时退出,而%file3% txt文件只有:
Displayname
------------- 关于for循环不工作的原因,请提供建议。
在文本文件中的第一个for循环中REG查询的部分输出:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe AIR
DisplayName REG_SZ Adobe AIR
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Cisco AnyConnect Secure Mobility Client
DisplayName REG_SZ Cisco AnyConnect Secure Mobility Client
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CitrixOnlinePluginPackWeb
DisplayName REG_SZ Citrix Receiver
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KLiteCodecPack_is1
DisplayName REG_SZ K-Lite Codec Pack 10.7.5 Basic
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Mobile Broadband HL Service
DisplayName REG_SZ Mobile Broadband HL Service以%文件3%表示的期望输出:
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_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
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_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" /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_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ (
:: echo skipping !DisplayName!
::) else (
:: echo !DisplayName! >> %file3%
::)
)发布于 2015-01-20 13:16:16
问题:
1)您指定了usebackq,但是使用了单引号,因此对于/F来说,处理的是字符串而不是命令。删除usebackq,循环将正确地处理该命令。我使用usebackq的唯一一次是在读取路径必须引用的文件时,通常是因为空格。
2)如果你的陈述很混乱:
=,但是比较运算符是==。if "!DisplayName:~1,71!"=="yourValue..."3)您想要排除输出的摘要行。最简单的解决方案是将输出输送到FIND或FINDSTR,并让它过滤掉您不想要的行。管道操作符必须在IN()子句中转义。
4)您可以让/F解析列(令牌)。您需要第三列,其中包含空格。前面的列中没有一个包含空格,因此可以使用tokens=2*,这意味着捕获第一个变量中的第二个令牌,并保留第二个变量之后的所有内容。
for /f "tokens=2*" %%A in (
'REG Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /V /F DisplayName /S /E^|find "DisplayName"'
) do echo %%B>>"%file3%"https://stackoverflow.com/questions/28042727
复制相似问题