Board logo

标题: [注册表类] 批处理如何输出注册表中多字符串的键值? [打印本页]

作者: alpha    时间: 2014-8-19 14:09     标题: 批处理如何输出注册表中多字符串的键值?

比如:HKCU\123项里面的test键值是:
123
456
789
我要让这个键值输出到1.txt文本中,也是注册表中的键值格式(而不是有换行符的那种):
123
456
789
作者: DAIC    时间: 2014-8-19 14:53

reg export HKCU\123 test.reg
把 test.reg 压缩之后传上来看看
作者: alpha    时间: 2014-8-19 16:59

回复 2# DAIC
作者: apang    时间: 2014-8-19 19:43

  1. @echo off
  2. for /f "tokens=1,2*" %%a in ('reg query "HKCU\123"') do (
  3.     if /i "%%a" == "test" set "var=%%c"
  4. )
  5. for %%a in ("%var:\0=" "%") do echo,%%~a
  6. pause
复制代码

作者: alpha    时间: 2014-8-19 21:45

本帖最后由 alpha 于 2014-8-19 21:47 编辑

回复 4# apang


    为什么我合并为一行之后,会一闪而过?
  1. (for /f "tokens=1,2*" %%a in ('reg query "HKCU\123"') do (if /i "%%a" == "test" set "var=%%c"))&(for %%a in ("%var:\0=" "%") do echo,%%~a)&pause
复制代码

作者: Linuxer    时间: 2014-8-19 22:23

把两个for套的括号去掉试试呢?
如果不行,那就是cmd识别不了这样的格式,还是分行写吧。
作者: apang    时间: 2014-8-19 22:35

回复 5# alpha


    你把它们整成一行,那就成复合语句了,那就必须开启变量延迟扩展

如果没有特殊要求,不建议这样干,可读性差,不便于修改维护
作者: alpha    时间: 2014-8-19 22:55

回复 7# apang


   说得妙,我发现开了延迟后,在cmd里面是无效的,必须要执行 cmd /v on,但是一旦开启这个,就不能合并为一行了,好纠结,还是那句话,怎么合并?
作者: alpha    时间: 2014-8-19 22:57

回复 6# Linuxer


    提示路径用法无效。
作者: CrLf    时间: 2014-8-19 23:04

回复 8# alpha


一定要写一行的话就是这样:
  1. cmd /v /c "(for /f "tokens=1,2*" %%a in ('reg query "HKCU\123"') do (if /i "%%a" == "test" set "var=%%c"))&(for %%a in ("!var:\0=" "!") do echo,%%~a)&pause"
复制代码
但 cmd 里也可以写多行命令啊,如果可以复制粘贴为啥要写成一行...
作者: alpha    时间: 2014-8-19 23:28

回复 10# CrLf


    OK,谢啦,问题解决喽
作者: alpha    时间: 2014-8-20 16:54

回复 10# CrLf


    又有问题了,如果路径里面有空格就不行了。
作者: apang    时间: 2014-8-20 20:45

可以兼容路径中含\0和空格的情况,不要想合并到一行
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set Lf=^
  4. for /f %%i in ('copy /z "%~0" nul') do for %%j in ("!Lf!") do (
  5.     endlocal
  6.     for /f "tokens=1,2*" %%a in ('reg query "HKCU\123" /se ^^^|')do (
  7.         if /i "%%a" == "test" (
  8.             set "var=%%c"
  9.             setlocal enabledelayedexpansion
  10.             echo,!var:^|=%%i%%~j!
  11.         )
  12.     )
  13. )
复制代码
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Windows\System32>reg query "HKCU\123" /se ^|

HKEY_CURRENT_USER\123
    test    REG_MULTI_SZ    (Start "" "C:\a b c\01.exe")|(Start C:\2.exe)|(Start
C:\3.exe)


C:\Windows\System32>C:\Users\apang\Desktop\test.bat
(Start "" "C:\a b c\01.exe")
(Start C:\2.exe)
(Start C:\3.exe)
C:\Windows\System32>

作者: DAIC    时间: 2014-8-20 20:55

回复 8# alpha


    出于什么样的需求必须要合并到一行?
作者: alpha    时间: 2014-8-20 21:30

回复 14# DAIC


    我的delphi不支持多行命令。
作者: CrLf    时间: 2014-8-20 22:02

回复 15# alpha


其实从效率和可靠性上考虑,不建议在编程语言中使用 shell 工具
dephi 本身就可以读取注册表:
http://zhidao.baidu.com/link?url ... cGH64mtUkPY9TORDCZq
作者: alpha    时间: 2014-8-21 02:23

回复 16# CrLf


    感谢你的帮助,但是我这个读取和普通的读取似乎不太一样,因为我这个是“多字符串类型”,delphi里面似乎执行读取“多字符串”的效率不高。
作者: CrLf    时间: 2014-8-21 03:41

回复 17# alpha


好吧,爱莫能助
那么你说的路径含空格是哪里的路径
作者: alpha    时间: 2014-8-21 14:11

回复 18# CrLf


    是字符串中每一行中的数值中有空格




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2