如何正确引用批处理文件中的内容?

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】:

如果您想将带有空格的内容传递给变量,请使用 `(键盘的左上角),这也应该处理嵌入的引号。如果您将带有空格的变量传递到另一个批处理中,请使用双引号。

【讨论】:

这根本没有回答如何逃避它们的问题。

以上是关于如何正确引用批处理文件中的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何读取内存中的 csv 文件以进行快速处理?

批处理引用变量到指定命令中的用法

如何将文件内容读入批处理文件中的变量?

批处理文件合并另一个批处理,将目录中的修改文件复制到另一个目录

PHP 脚本未正确从 MySQL 数据生成 KML 文件 - 如何正确处理此问题?

如何使用批处理搜索 .txt 文件中的特定短语