如何正确引用批处理文件中的内容?
Posted
技术标签:
【中文标题】如何正确引用批处理文件中的内容?【英文标题】:How to properly quote something in a Batch file? 【发布时间】:2011-11-01 22:14:00 【问题描述】:在批处理文件中引用变量的正确方法是什么?
我发现"%~dp0"
之类的东西不起作用,因为它原来是"C:\Windows\"
之类的东西,而后者又被解释为末尾有一个转义的引号。
哦,当然,嵌入式引号总是存在问题——还有什么方法可以避免这些问题吗?
【问题讨论】:
+1:这是个好问题,不是吗? =D 我尝试混合使用 ^、& 和 |用不同的引号,反引号等围绕变量(即使有些变体很愚蠢,我知道它不会起作用),但似乎无法逃脱引号。 【参考方案1】:您在这里混合了一些不同的引用/转义问题。
在批处理本身中,引号和转义的规则与 reg
的规则不同。
在批处理中,插入符号会转义下一个字符,但只能在引号之外(只有一个例外是在引号内转义感叹号)。
reg.exe
使用\
转义下一个字符,EDIT: 但它似乎只转义了引号字符。
要嵌入单引号,使用两个引号会更容易。
只有内容末尾的反斜杠是一个问题,因为它会转义最后一个引号。
Reg Add HKCU\Temp /d "One""two\\" /t REG_SZ
添加One"two\
【讨论】:
等等,reg
unescapes 我给它的字符串?我在任何地方都没有看到这方面的记录——你确定吗?
几乎,我对其进行了测试,它可以与"C:\Hello""world\\"
一起使用,但它似乎有点复杂,请参阅我的编辑
我的猜测是它遵循these rules,尽管我可能是错的。我认为这与 Reg 无关。
但是即使reg.exe
使用CommandLineToArgvW
函数,也是reg
进行了转义,它并没有解释为什么“”会变成单引号
没有。 cmd.exe
不使用这种转义。一个简单的测试在"One""two\\"
的输出中显示了echo "One""two\\"
的结果【参考方案2】:
您要引用哪个变量?如果您在环境/系统变量中定义了变量,则可以将其引用为 %variable_name%
。 例如,如果您需要引用 'path' 变量,则 %path%
是正确的方法
【讨论】:
【参考方案3】:如果您想将带有空格的内容传递给变量,请使用 `(键盘的左上角),这也应该处理嵌入的引号。如果您将带有空格的变量传递到另一个批处理中,请使用双引号。
【讨论】:
这根本没有回答如何逃避它们的问题。以上是关于如何正确引用批处理文件中的内容?的主要内容,如果未能解决你的问题,请参考以下文章
批处理文件合并另一个批处理,将目录中的修改文件复制到另一个目录