cmd.exe 会转义两个相邻的引号,尽管我的第一个引号是用插入符号转义的

cmd.exe 会转义两个相邻的引号,尽管我的第一个引号是用插入符号转义的

我对引号感到困扰,我已经为此困扰了好几个小时...我基本上有一个外部程序(FOO),它需要一个字符串来处理,并且在该字符串的末尾和开头都有一个引号。

FOO /f "BAR ^"BAZ^""

该代码不起作用,因为当我转义包含“BAZ”的引号时,它也会转义最后一个引号,因为即使第一个引号通过插入符号转义,相邻的两个引号无论如何都会被转义。

我不想使用像 sed 之类的东西,因为我希望它严格使用 Windows Batch。

编辑:这是一个重现我的问题的命令:

REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /t REG_SZ /v Update /d "cmd.exe /c ""echo CreateObject(""Wscript.Shell"").Run """""""" ^& WScript.Arguments(0) ^& """""""", 0, False > invis.vbs && CALL invis.vbs update.bat""" /f

答案1

我写了一个小C程序来找出实际传递的内容cmd.exe

#include "stdafx.h"

int main(int argc, char **argv)
{
    for (int i = 0; i < argc; i++)
    {
        printf("\n%d: '%s'\n", i, argv[i] ? argv[i] : "<null>");
    }
    return 0;
}

称呼:

consoleapplication1 ADD KEYNAME /t REG_SZ /v FOO /d "BAR ""BAZ""" /f

程序到达的参数:

0: 'consoleapplication1'

1: 'ADD'

2: 'KEYNAME'

3: '/t'

4: 'REG_SZ'

5: '/v'

6: 'FOO'

7: '/d'

8: 'BAR "BAZ"'

9: '/f'

添加单引号只是为了说明目的。

底线:
重复的双引号按预期工作。

笔记:
REG使用反斜杠作为特殊转义字符,如所述这里

答案2

来源语法:转义符、分隔符和引号

特别案例

少数命令遵循略有不同的规则,FINDSTR, 登记和 RUNAS 都用作\转义字符,而不是^

您使用过:

REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR ^"BAZ^"" /f

尝试一下这个:

REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR \"BAZ\"" /f

相关内容