在一个窗户批文件的,当你做到以下几点:

set myvar="c:\my music & videos"

变量 myvar 储存的报价包括在内。老实说我觉得这很愚蠢的。该报价是只是告诉那里的串的开始和结束,不要储存一部分的价值本身。
我怎么可以防止这种情况发生?

谢谢。

有帮助吗?

解决方案

set "myvar=c:\my music & videos"

注意引号MYVAR之前启动。这其实就这么简单。 附注:MYVAR不能事后,除非它用引号引用,因为与将被读作命令分隔呼应,但它仍然工作作为路径

http://ss64.com/nt/set.html 下“变量名可以包括空间“

其他提示

这是做到这一点的正确方法:

set "myvar=c:\my music & videos"

在引号将不会被包括在可变值。

这取决于你怎么想使用的变量。如果你只是想利用价值的变量没有报价可以使用延迟的扩大和串取代,或 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

但是,如果你想使用的变量的命令,必须使用报价值,或附上的价值变量中的报价:

  1. 使用的字符串替换和延迟扩大使用价值的变量没有报价,但采用的变量的命令:

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  2. 使用 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的,并着手把我所有的小构建脚本到一个单一的构建脚本。 。

和它险些破门我的心脏,让所有那些小的脚本一起工作,在不同的机器,略有不同的设置,ye神是可怕的 - 特别是在设定的变量和参数的传递。这是真的脆,稍有事情会打破它,需要调整30分钟就搞定了再打算。

最后 - 我可以固执我 - 我打发了一大堆在和在大约一天的重新写了这一切在JavaScript 后,在命令提示符下运行它用的CScript。

我没有回头。虽然这几天它的MSBuild和巡航控制,如果我需要做一些稍微参与了一个批处理脚本,我使用JScript的。

在Windows命令解释程序允许您使用围绕整个set命令引号(有效在Windows NT的每个版本从NT 4.0到Windows 2012 R2)

您的脚本应该只是被写成如下:

@echo OFF

set "myvar=C:\my music & videos"

然后你可以将引号中的变量需要。

与CMD提示工作似乎有时深奥,但命令解释器实际上是在服从它的内部逻辑,你只需要重新思考的东西表现很稳健。

事实上,set命令不要求你在所有使用引号,但两者你在做你的变量赋值的方式和途径,不使用引号的方法可以使你有在你的变量多余的空格这很难调试脚本时注意。

e.g。两者的下方是技术上有效的,但你可以有尾随空格,所以它不是一个好的做法:

set myvar=some text   
set myvar="some text" 

e.g。两者的下面是用于Windows命令解释程序设置变量好方法,但是双引号方法优于:

set "myvar=Some text"
(set myvar=Some value)

这两种留下任何的解释变量会正是你正在寻找的数据。

强大的文本然而,你的目的,只是引述方法将工作有效,因为你使用的是保留字符

因此,可以使用:

set myvar="c:\my music & videos"

然而,即使变量正确设置为这个字符串,当你回声刺痛命令解释程序将解释符号作为关键字来表示另一份声明如下:

所以,如果你想呼应从变量的CMD解释仍然需要被告知这是一个文本字符串,或者如果你不想引号,以显示你必须做下列之一的字符串:

回声行情变量:

Echo."%myvar%"

回声变量没有引号:

Echo.%myvar:&=^&%
<nul SET /P="%myvar%"

在上述两种情况下,你可以没有引号呼应串就好了。实施例以下输出:

C:\Admin>    Echo.%myvar:&=^&%
C:\my music & videos

C:\Admin>    <nul SET /P="%myvar%"
C:\my music & videos
C:\Admin>

尝试使用转义字符 '^',e.g。

set myvar=c:\my music ^& videos

您将有你的时候要小心展开MYVAR因为shell可能不能治疗和作为文字。如果上述不工作,试图插入一个插入符号到字符串太:

set myvar=c:\my music ^^^& videos

您的必须的有引号,如果你设置的文本包括某些字符,包括。如果您的文本不包括,然后你就不需要加引号。

例如,如果文本只是“C:\我的音乐”,那么你可以这样做:

set myvar = c:\my music

但因为你的文字有您需要的报价。

修改

或者戴维在他回答说,你可以逃避问题字符的 ^^^ ,但这种方法为不是你唯一需要的字符提防逃离。在实践中更容易与报价坚持,而不是逃避一切问题的字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top