如何使用批处理文件中包含圆括号的目录

时间:2013-05-24 15:34:26

标签: batch-file dos

我有一个批处理文件,其中第一行显示为:

set DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)
PUSHD %DIRwhereRUN%

但批次不起作用。

如果我创建一个名为testSTABLEunstable_WITHrandomBED的目录并复制我的东西,那么一切都很顺利。有没有办法让它与括号一起工作?我不想重命名至少有两个原因。

3 个答案:

答案 0 :(得分:2)

要像你一样隔离两条线路是非常困难的 - 并且具有误导性。这两行没有错。

您遇到的困难是“块”语句,如

IF ... (something
   something
   somethinginvolving DIRWHERERUN
   )

这是因为批处理在执行命令之前用其当前值替换任何%var%的值,因此错误解释)中的%Dirwhererun%作为结束括号IF(或ELSEFOR。)

克服这个问题的方法是"escape" %dirwhererun%的{​​{1}}(即暂时暂停其特殊含义) - 这是使用插入符号)完成的 - 本身是一个特殊字符(具有特殊含义“以下字符只是一个字符,而不是一个特殊字符”。)

那么 - 怎么做?

以下是演示:

@ECHO OFF     SETLOCAL

^

(请注意,我使用set "DIRwhereRUN=U:\UNIVERSITY\testSTABLEunstable(WITHrandomBED^)" SET dir set DIRwhereRUN=U:\THISWILLBEWRONG(WITHrandomBED^) SET dir set DIRwhereRUN=U:\UNIVERSITY\testSTABLEunstable(WITHrandomBED^^) SET dir set DIRwhereRUN=U:\UNIVERSITY\testSTABLEunstable(WITHrandomBED) SET dir MD %DIRwhereRUN% PUSHD "%DIRwhereRUN%" DIR POPD SET dirwhererun=%dirwhererun:)=^^)% SET dir 作为临时驱动器。我正在使用原始U:故意创建目录,以表明它不是SET或正常操作导致的问题)

请注意,SET使用参数周围的引号时,将按字面值应用该值。此表单通常用于确保行中的杂散尾随空格不包含在变量的值中。

请注意,set似乎在下一个^中无效 - 因为它所做的只是逃避set - 并且)不是普通的特殊字符)

使用第三个版本时,插入了插入符号 - 但只有一个,因为SET转义^^是普通字符。

然后我们使用) unadorned进行所有操作。显然,尝试重新创建目录会导致错误 - 但这是因为目录已经存在,而不是因为命令本身有任何问题。

如上所示,将列出目录,因此)可以正常工作。

最后,有一种动态设置变量的方法 - 可能更好地设置为另一个变量名。这可以从文件中读取变量或从用户输入 - 也就是说,不是字面上指定的。

嗯 - 不是最后。还有两个怪癖:首先,PUSHD并未%转义^,第二,%似乎是ECHO(最灵活的形式(紧跟ECHO之后的字符,通常是空格,但可能是其他一些字符) - 并且不参与语句阻塞机制。

答案 1 :(得分:1)

(和)是shell的特殊字符,因此您需要转义它们。 Cmd.exe的转义字符为 ^ 。所以你可以做到以下几点:

set DIRWHERERUN=C:\UNIVERSITY\testSTABLEunstable^(WITHrandomBED^)

比尔

答案 2 :(得分:0)

使用双引号。

set "DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)"
PUSHD "%DIRwhereRUN%"