Board logo

标题: [其他] bat脚本中到底怎么使用转义字符^ [打印本页]

作者: watson    时间: 2023-7-21 11:29     标题: bat脚本中到底怎么使用转义字符^

我看到这样一个代码:
  1. For /f skip^=2^ tokens^=2^ delims^=^" %%i in ('Reg Query "HKEY_CURRENT_USER\Software\Classes\Applications\WinRAR.exe\shell\open\command" /ve') do Set winrar=%%i
复制代码
问:
1.    for语句中怎么需要这么多的转义字符,连空格都需要吗?
2.    skip^=2^ tokens^=2^ delims^=^"这个怎么不可以用双引号引起吗?比如:"skip=2 tokens=2 delims=^""。
那转义字符到底在什么情况下才需要使用?
作者: Batcher    时间: 2023-7-21 12:07

回复 1# watson


这种写法主要是为了用双引号做列分隔符
http://bbs.bathome.net/thread-12395-1-1.html#pid79445

知道有这么一回事就行了,其它情况下正常使用即可。
作者: aloha20200628    时间: 2023-7-23 14:25


各种编程代码中均有一些语法保留字符,因而也就有所谓的相应“转义字符”的用法,批处理脚本亦然。
外网曾有人对此作过梳理(https://www.robvanderwoude.com/escapechars.php),可能有遗漏,在此编译给诸位仅供参考。

【小结:批处理脚本中的转义字符用法 — 也就是保全那些特殊字符本义(不被转义)的方法】

一。在各种场合,如下字符须用一个 % 前缀以免被转义
% 》%%

二。未被双引号包裹时,如下字符须用一个 ^ 前缀以免被转义
^ 》^^
& 》^&
< 》^<
> 》^>
|  》^|

三。在 for /f...() 的格式表达式和条件表达式中(即使后者已被双引号包裹),如下字符须用一个 ^ 前缀以免被转义
, 》^,
; 》^;
= 》^=
( 》^(
) 》^)

四。在 for /f...() 未用 usebackq 参数时的条件表达式中,如下字符须用一个 ^ 前缀以免被转义
' 》^'

五。在 for /f...() 采用 usebackq 参数时的条件表达式中,如下字符须用一个 ^ 前缀以免被转义
` 》^`

六。在变量延迟开启的语块中,如下字符须用两个 ^ 前缀以免被转义
! 》^^!

七。在 find.exe 的搜索表达式中,如下字符须用一个 " 前缀以免被转义
" 》""

八。在 findstr.exe 的正则匹配表达式中,如下字符须用一个 \ 前缀以免被转义
\ 》\\
[ 》\[
] 》\]
" 》\"
. 》\.
* 》\*
? 》\?

作者: watson    时间: 2023-7-25 17:32

回复 3# aloha20200628


    必须给个赞!!!
作者: watson    时间: 2023-7-25 17:33

回复 2# Batcher


   非常感谢
作者: qixiaobin0715    时间: 2023-7-27 17:22

根据个人使用的经验,补充一下findstr中的一般表达式特殊字符的转义问题:
1. ?不需要使用\来转义,和其它普通字符使用无区别;
2. 短横线-要用\转义;
3. 小于号和大于号使用时可以写在中括号内,[<]、[>]或[><]。
作者: qixiaobin0715    时间: 2023-7-28 15:35

回复 6# qixiaobin0715
第3点感觉有画蛇添足的味道,可忽略。
作者: GNGW    时间: 2024-3-20 10:05

回复 3# aloha20200628


    https://www.robvanderwoude.com/escapechars.php,实话说我没看懂这个帖子想表达什么,但是我看到了“在变量延迟开启的语块中,如下字符须用两个 ^ 前缀以免被转义
! 》^^!”。这是为什么?什么机制?为什么开启变量延迟扩展之后,需要用额外的^来转义^字符?
作者: aloha20200628    时间: 2024-3-20 11:07

回复 8# GNGW

如果cmd.exe有源码公开,玩c/c++的人也许可从中一览无余其中的奥秘...
也许有专业人士用反编译工具拆卸过cmd.exe,但绝大绝大绝大多数人不在其列,也不知道其所为...
商品化软件手册只给用法,不说机理,而常年未予实质性“呵护”的cmd.exe,很难说还有一整套完备详尽的用法手册???
所以,多年来用户和玩家只是将其作为一种“实验性技术工具”,在各地互联网平台互相交流分享探讨各自用法的“是非与成败”...
这条走了几十年凹凸不平的老路只有脚印和前人留下的路标... 没有why? 只有that it is...

作者: GNGW    时间: 2024-3-20 11:42

回复 9# aloha20200628


    这句好像那句“不要管为什么,你知道怎么用就行了”,但其实我发现我一直的做法都是与之相悖的,就是觉得要探究为什么,探究了为什么才能细致的用,或者模仿或者举一反三,虽然我们无法做到把这个“黑盒子”解剖,但我相信依然有前辈,产出各种猜想,用各种方法验证,以达到证实内部机理的目的。对于这样的前辈,我才是真正的佩服与我想说他们才具有真正的工匠精神。




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