我有一个批处理文件,其中前两行如下:
set DIRwhereRUN=C:UNIVERSITYtestSTABLEunstable(WITHrandomBED)
PUSHD %DIRwhereRUN%
但是批处理不起作用。
如果我创建一个名为testSTABLEunstable_WITHrandomBED
的目录,并将我的东西复制到那里,一切都很顺利。有办法使它与括号一起工作吗?我不想重命名至少有两个原因
像您这样将两行代码分开是非常困难的,而且容易引起误解。这两行没有问题。
您遇到的困难是"块"语句,如
IF ... (something
something
somethinginvolving DIRWHERERUN
)
这是因为批处理在执行命令之前将任何%var%
的值替换为其当前值,因此将%Dirwhererun%
中的)
误解为IF
(或ELSE
或FOR
)的右括号。
克服这个问题的方法是"escape"
%dirwhererun%
的)
(即。这是通过插入符号^
完成的,它本身就是一个特殊字符(特殊含义是"下面的字符只是一个字符,而不是一个特殊字符")
那么——怎么做呢?
这里有一个演示:
@ECHO对本地
set "DIRwhereRUN=U:UNIVERSITYtestSTABLEunstable(WITHrandomBED^)"
SET dir
set DIRwhereRUN=U:THISWILLBEWRONG(WITHrandomBED^)
SET dir
set DIRwhereRUN=U:UNIVERSITYtestSTABLEunstable(WITHrandomBED^^)
SET dir
set DIRwhereRUN=U:UNIVERSITYtestSTABLEunstable(WITHrandomBED)
SET dir
MD %DIRwhereRUN%
PUSHD "%DIRwhereRUN%"
DIR
POPD
SET dirwhererun=%dirwhererun:)=^^)%
SET dir
(注意,我使用U:
作为临时驱动器。我故意使用原始SET
创建目录,以表明它不是SET
或导致问题的正常操作)
请注意,set
在参数周围使用引号的地方,值是按字面意思应用的。这种形式通常用于确保行中多余的尾随空格不包含在变量的值设置中。
请注意,^
在下一个set
中似乎无效-因为它所做的一切都是转义)
-并且)
不是普通SET
中的特殊字符
在第三个版本中,包含了插入符号——但只有一个,因为^
转义了^
,而)
是一个普通字符。
然后我们使用未修饰的)
执行所有操作。显然,尝试重新创建目录会导致错误——但这是因为该目录已经存在,而不是因为命令本身有任何问题。
PUSHD
工作正常。
最后,还有一种动态设置变量的方法——最好设置为另一个变量名。当变量可能从文件中读取或从用户处输入时(即不按字面指定),这是有用的。
还没到最后。还有两个奇怪之处:首先,%
不是由^
转义的,而是由%
转义的;其次,ECHO(
似乎是ECHO
最灵活的形式(紧跟在ECHO
后面的字符通常是空格,但也可能是其他一些字符),而且不参与语句阻塞机制。
(and)是shell的特殊字符,因此需要转义。Cmd.exe的转义字符是^所以你可以这样做:
set DIRWHERERUN=C:UNIVERSITYtestSTABLEunstable^(WITHrandomBED^)
比尔使用双引号
set "DIRwhereRUN=C:UNIVERSITYtestSTABLEunstable(WITHrandomBED)"
PUSHD "%DIRwhereRUN%"