我有一个批处理文件,其中第一行显示为:
set DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)
PUSHD %DIRwhereRUN%
但批次不起作用。
如果我创建一个名为testSTABLEunstable_WITHrandomBED
的目录并复制我的东西,那么一切都很顺利。有没有办法让它与括号一起工作?我不想重命名至少有两个原因。
答案 0 :(得分:2)
要像你一样隔离两条线路是非常困难的 - 并且具有误导性。这两行没有错。
您遇到的困难是“块”语句,如
IF ... (something
something
somethinginvolving DIRWHERERUN
)
这是因为批处理在执行命令之前用其当前值替换任何%var%
的值,因此错误解释)
中的%Dirwhererun%
作为结束括号IF
(或ELSE
或FOR
。)
克服这个问题的方法是"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%"