我有一个批处理文件,其中前两行读取:
set DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)
PUSHD %DIRwhereRUN%
但批处理不起作用。
如果我创建一个名为testSTABLEunstable_WITHrandomBED
并复制我的东西的目录,那么一切都会顺利进行。有没有办法让它与括号一起工作?我不想重命名至少有两个原因。
我有一个批处理文件,其中前两行读取:
set DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)
PUSHD %DIRwhereRUN%
但批处理不起作用。
如果我创建一个名为testSTABLEunstable_WITHrandomBED
并复制我的东西的目录,那么一切都会顺利进行。有没有办法让它与括号一起工作?我不想重命名至少有两个原因。
像你一样隔离两条线是非常困难和误导的。这两行没有错。
您遇到的困难在于“阻止”语句,例如
IF ... (something
something
somethinginvolving DIRWHERERUN
)
这是因为批处理%var%
在执行命令之前将 any 的值替换为其当前值,因此将)
in误解为(or或.)%Dirwhererun%
的右括号IF
ELSE
FOR
克服这个问题的方法是"escape"
%dirwhererun%
's )
(即暂时挂起它的特殊含义) - 这是用插入符号完成的^
- 它本身是一个特殊字符(具有特殊含义“后面的字符只是一个字符,而不是一个特殊字符“。)
那么 - 如何做到这一点?
这是一个演示:
@ECHO OFF 设置本地
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
在第三个版本中,插入符号被包括在内 - 但只有一个,因为^
转义^
并且)
是一个普通字符。
然后我们使用)
朴素的进行所有的操作。显然尝试重新创建目录会导致错误 - 但这是因为目录已经存在,而不是因为命令本身有任何问题。
如图所示,该目录将被列出,因此PUSHD
可以正常工作。
最后,有一种动态设置变量的方法——可能更好地设置为另一个变量名。这在变量可以从文件中读取或从用户输入的情况下很有用——也就是说,没有按字面意思指定。
好吧 - 最后不是。还有两个怪癖:首先,%
不是由^
而是由转义%
,其次,ECHO(
似乎是最灵活的形式ECHO
(紧随其后的字符ECHO
,通常是空格,但可能是其他一些) - 并且不参与语句阻塞机制。
( 和 ) 是 shell 的特殊字符,因此您需要对它们进行转义。Cmd.exe 的转义字符是^。因此,您可以执行以下操作:
set DIRWHERERUN=C:\UNIVERSITY\testSTABLEunstable^(WITHrandomBED^)
账单
使用双引号。
set "DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)"
PUSHD "%DIRwhereRUN%"