首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环程序出口批处理- Reg查询- Win 7

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

Stack Overflow用户
提问于 2015-01-20 10:14:05
回答 1查看 267关注 0票数 0

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

代码语言:javascript
复制
Displayname 
------------- 

关于for循环不工作的原因,请提供建议。

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

代码语言:javascript
复制
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%表示的期望输出:

代码语言:javascript
复制
Displayname
-------------
Adobe AIR
Cisco AnyConnect Secure Mobility Client
Citrix Receiver
K-Lite Codec Pack 10.7.5 Basic
Mobile Broadband HL Service

批处理代码:

代码语言:javascript
复制
@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%
::)
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 13:16:16

问题:

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

2)如果你的陈述很混乱:

  • 您的命令使用普通展开而不是延迟展开,因此它无法看到循环中设置的值。
  • 您使用了=,但是比较运算符是==
  • 在IF语句中使用延迟展开子字符串操作时,应在比较的两边引用值,否则必须转义逗号。我推荐引号(实际上你根本不需要IF )。

代码语言:javascript
复制
if "!DisplayName:~1,71!"=="yourValue..."

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

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

代码语言:javascript
复制
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%"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28042727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档