我对引号感到困扰,我已经为此困扰了好几个小时...我基本上有一个外部程序(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