Board logo

标题: [特效代码] [已解决]批处理reg add命令参数后跟带空格的路径时之奇怪现象 [打印本页]

作者: Hello123World    时间: 2011-6-8 01:53     标题: [已解决]批处理reg add命令参数后跟带空格的路径时之奇怪现象

win7 企业版
  1. @echo off
  2. ::reg add "HKEY_LOCAL_MACHINE\SOFTWARE\hello" /v world /t reg_sz /d "c:\hello world\" /f
  3. ::c:\hello world" /f
  4. ::echo y | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\hello" /v world /t reg_sz /d "c:\hello world\"
  5. ::c:\hello world"
  6. ::echo y | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\hello" /v world /t reg_sz /d c:\hello world\
  7. ::错误: 无效语法。
  8. ::键入 "REG ADD /?" 了解用法信息。
  9. ::echo y | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\hello" /v world /t reg_sz /d "c:\hello world\
  10. ::c:\hello world\
  11. pause>nul
复制代码
每条执行代码后面跟的都是修改注册表的结果。

这里有几个现象很奇怪:
1.用引号 加 /f 参数时,world后面的 \ 消失了,/f参数似乎被什么转义了
2.单纯用引号的时候,\ 依旧是消失的,引号反而跟了——难道 \ 转义了"   ?
3.一个引号时反而实现了我本意,一个引号转义空格?
作者: Batcher    时间: 2011-6-8 02:07

  1. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\hello" /v world /t reg_sz /d "c:\hello world\\" /f
复制代码

作者: applba    时间: 2011-6-8 02:35

本帖最后由 applba 于 2011-6-8 02:49 编辑

单个引号可以转义其后的所有内容,直到遇到下一个配对的引号,如果没有遇到,转义作用会持续到逻辑行的结束。
作者: applba    时间: 2011-6-8 02:48

本帖最后由 applba 于 2011-6-8 03:06 编辑

反斜杠在这里作为转义符号,可以转义\ "和分隔符等。\消失的原因在于它转义了其后的参数分隔符空格

比如要添加这个键值:
"d:\Program Files\Tencent\QQPCMgr\5.0.1407.201\QQPCTray.exe" /regrun
由于路径部分带了空格所以必须要用引号, /regrun参数之前又有空格,添加键值的的时候还要继续使用一层引号。

""d:\Program Files\Tencent\QQPCMgr\5.0.1407.201\QQPCTray.exe" /regrun"
这样添加肯定会出错的^,开头的两个引号被错误配对,后面的两个引号又会被错误配对。

你必须使用\来转义内层的引号,正确的用法如下:
  1. reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v " QQPCTray2" /d "\"d:\\Program Files\\Tencent\\QQPCMgr\\5.0.1407.201\\QQPCTray.exe\" /regrun" /f
复制代码
论坛怎么了,tab发上来就都成了??
作者: Batcher    时间: 2011-6-8 10:41

4# applba


DZ论坛会把tab转换成空格
作者: cjiabing    时间: 2011-6-8 11:37

  1. ::摘自《BatMPlayer 2011 Beta V3.28.5.15》,五修改。
  2. ::%##%表示你的文件路径,已经包含引号,可以使用带有空格的路径。
  3. reg add HKCR\AudioCD\shell\open\command /t REG_SZ /ve /f /d "\"%##%\" %%1 %%*
  4. reg add HKCR\AudioCD\shell\PlayList /t REG_SZ /ve /f /d 添加到BatMPlayer播放列表
复制代码

你是幸运的,以前可没有人回答这个问题!~
作者: Hello123World    时间: 2011-6-8 17:24

按照诸位的说法,\是可以作为转义字符了。
作者: Hello123World    时间: 2011-6-8 18:36

"也是作为转义字符——以前只是知道要为有空格的路径加上双引号,现在知道为什么要加上了。
作者: applba    时间: 2011-6-8 21:10

很多编程语言都把\作为转义符号……
但是cmd.exe本身是不支持这个转义符号的……
只是那些外部命令如reg自己对\进行了解析……
作者: Batcher    时间: 2011-6-8 21:33

7# Hello123World


不是“可以”,而是“本来就是”^_^
作者: Hello123World    时间: 2011-6-11 19:26

原来\作为转义字符是来源正则表达式
作者: Batcher    时间: 2011-6-11 19:29

11# Hello123World


其实并非来源于哪里,关键是解释器/编译器要规定一些特殊字符的特殊用法,以便在解释/编译的时候能够正确区分。
作者: Hello123World    时间: 2011-6-11 19:52

本帖最后由 Hello123World 于 2011-6-11 19:54 编辑

12# Batcher
  1. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\hello" /v world /t reg_sz /d "c:\hello world\\" /f
复制代码
我仔细想想,还有个问题,如果\是转义字符的话,为什么
c:\hello world\\ ,hello前面的\没有消失?
echo ^hello 显示的结果是hello——^消失了。——这说明转义过程中即便是不需要转义的符号,还是会得到转义(致使转义字符消失),那么为什么hello前面的\没有消失?
作者: tiandyoin    时间: 2023-9-27 17:59

本帖最后由 tiandyoin 于 2023-9-28 00:46 编辑

回复 13# Hello123World


    1.与双引号相连前面的连续个 \ 都需要转义,使用 \\ 表示 \,使用 \" 表示 ",也可以使用 "" 表示 "。如 \\" 转义为 \\\\\"
    2.为避免最后一串连续的 \ 与在外层加的双引号起作用, 最后一串连续的 \ 也要转义为 \\ 。如 s=a\\, 调用 "%s%" 时,s 要转成 a\\\\
    3.除此之外的 \ 不需要转义。

但这里有一个问题,我不知道怎么转义末尾的空格,如
  1. reg add "HKEY_CURRENT_USER\1" /v "mouse \\\\\" " /d "mouse \\\\"" without \ Borders\\\\"  /t "REG_SZ" /f
复制代码
这里要添加一个注册表值为 【mouse \\" 】,如果使用 \" 转义双引号, 则【"mouse \\\\\" "】一共三个双引号,无法配对。
如果使用 "" 转义双引号, 【"mouse \\\\"" "】,一共四个双引号,配对正确。但是添加到注册表后,末尾的空格还是丢失了,变成了【mouse \\"】
试了很多转义方法均不能保留空格。
作者: lforl    时间: 2023-12-7 12:48

批处理常用符号详解
http://www.bathome.net/viewthrea ... 3%D3%C3%B7%FB%BA%C5




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