在Windows批处理文件中,执行以下操作时:
set myvar="c:\my music & videos"
变量myvar
与包含的引号一起存储.老实说,我发现这非常愚蠢.引号只是告诉字符串的开始和结束位置,而不是作为值本身的一部分存储.
我怎样才能防止这种情况发生?
谢谢.
这是正确的方法:
set "myvar=c:\my music & videos"
引号不会包含在变量值中.
set "myvar=c:\my music & videos"
注意引号在myvar之前开始.实际上就是这么简单.旁注:myvar之后不能回显,除非它用引号括起来,因为&将被读作命令分隔符,但它仍然可以作为路径使用.
http://ss64.com/nt/set.html "变量名称可以包含空格"下
这取决于您希望如何使用变量.如果您只想使用不带引号的变量值,可以使用延迟扩展和字符串替换,或者for
命令:
@echo OFF SETLOCAL enabledelayedexpansion set myvar="C:\my music & videos"
正如andynormancx所述,由于字符串包含引号,因此需要引号&
.或者你可以用它逃脱它^
,但我认为报价有点清洁.
如果使用字符串替换的延迟扩展,则获得不带引号的变量的值:
@echo !myvar:"=! >>> C:\my music & videos
您还可以使用以下for
命令:
for /f "tokens=* delims=" %%P in (%myvar%) do ( @echo %%P ) >>> C:\my music & videos
但是,如果要在命令中使用变量,则必须使用带引号的值或将变量的值括在引号中:
使用字符串替换和延迟扩展来使用不带引号的变量值,但在命令中使用该变量:
@echo OFF SETLOCAL enabledelayedexpansion set myvar="C:\my music & videos" md %myvar% @echo !myvar:"=! created.
使用该for
命令使用不带引号的变量值,但在命令中使用变量时,您必须用变量括起变量:
@echo OFF set myvar="C:\my music & videos" for /f "tokens=* delims=" %%P in (%myvar%) do ( md "%%P" @echo %%P created. )
简而言之,实际上没有干净的方法来使用包含&
批处理文件中的嵌入空格和/或s 的路径或文件名.
使用jscript.
许多月前(即大约8年的时间)或者我正在研究一个大型的C++/VB6项目,我有各种批处理脚本来完成部分构建.
然后有人指着我参加乔尔测试,我特别迷恋第2点,并着手将我所有的小构建脚本整合到一个单独的构建脚本中...
它几乎打破了我的心脏,让所有那些小脚本在不同的机器上一起工作,设置略有不同,你知道它是可怕的 - 特别是设置变量和参数传递.它真的很脆弱,最轻微的东西会打破它,需要30分钟的调整再次开始.
最终 - 我可能会很顽固 - 我把所有内容都放进去,并在大约一天内用JavaScript重写它,用命令提示符用CScript运行它.
我没有回头.虽然现在它是MSBuild和Cruise Control,如果我需要做一些甚至稍微涉及批处理脚本的东西,我使用jscript.