Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理Windows批处理脚本中的引号_Windows_Batch File_Quotes_Scripting - Fatal编程技术网

处理Windows批处理脚本中的引号

处理Windows批处理脚本中的引号,windows,batch-file,quotes,scripting,Windows,Batch File,Quotes,Scripting,在Windows批处理文件中,执行以下操作时: set myvar=“c:\my music&videos” 变量myvar存储时包含引号。老实说,我觉得这很愚蠢。引号只是告诉字符串的开始和结束位置,而不是作为值本身的一部分存储。 我怎样才能防止这种情况发生 谢谢。如果要设置的文本包含某些字符,包括和,则必须使用引号。如果您的文本没有包含和,则不需要引号 例如,如果文本仅为“c:\my music”,则可以执行以下操作: set myvar = c:\my music 但是因为你的文本有一个&

在Windows批处理文件中,执行以下操作时:

set myvar=“c:\my music&videos”

变量
myvar
存储时包含引号。老实说,我觉得这很愚蠢。引号只是告诉字符串的开始和结束位置,而不是作为值本身的一部分存储。
我怎样才能防止这种情况发生

谢谢。

如果要设置的文本包含某些字符,包括,则必须使用引号。如果您的文本没有包含,则不需要引号

例如,如果文本仅为“c:\my music”,则可以执行以下操作:

set myvar = c:\my music
但是因为你的文本有一个&,你需要引号

编辑:

或者,正如Dave在他的回答中所说,你可以用^^来逃避问题角色,但要小心这种方法,因为&不是你需要逃避的唯一角色。实际上,使用引号比转义所有问题字符要容易得多。

如果要设置的文本包含某些字符,则必须使用引号,包括&。如果您的文本没有包含,则不需要引号

例如,如果文本仅为“c:\my music”,则可以执行以下操作:

set myvar = c:\my music
但是因为你的文本有一个&,你需要引号

编辑:


或者,正如Dave在他的回答中所说,你可以用^^来逃避问题角色,但要小心这种方法,因为&不是你需要逃避的唯一角色。实际上,使用引号比转义所有问题字符要容易得多。

尝试使用转义字符“^”,例如

set myvar=c:\my music ^& videos
在扩展myvar时要小心,因为shell可能不会将&视为一个文本。如果上述操作无效,请尝试在字符串中插入插入插入符号:

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

尝试使用转义字符“^”,例如

set myvar=c:\my music ^& videos
在扩展myvar时要小心,因为shell可能不会将&视为一个文本。如果上述操作无效,请尝试在字符串中插入插入插入符号:

set myvar=c:\my music ^^^& videos
使用jscript

许多月前(即大约8年左右),我正在从事一个大型C++/VB6项目,我有各种各样的批处理脚本来完成部分构建

然后有人指给我看,我特别喜欢第2点,并开始将我所有的小构建脚本合并到一个构建脚本中

这几乎让我心碎,让所有这些小脚本一起工作,在不同的机器上,使用稍微不同的设置,这太可怕了——特别是设置变量和参数传递。它真的很脆,最轻微的东西都会把它弄坏,需要30分钟的调整才能重新开始

最终-我可以固执的自我-我把所有的东西都扔了进去,在大约一天的时间里用JavaScript重新编写了它,用CScript在命令提示符下运行

我没有回头看。虽然现在是MSBuild和Cruise Control,但如果我需要做一些与批处理脚本有关的事情,我会使用jscript。

使用jscript

许多月前(即大约8年左右),我正在从事一个大型C++/VB6项目,我有各种各样的批处理脚本来完成部分构建

然后有人指给我看,我特别喜欢第2点,并开始将我所有的小构建脚本合并到一个构建脚本中

这几乎让我心碎,让所有这些小脚本一起工作,在不同的机器上,使用稍微不同的设置,这太可怕了——特别是设置变量和参数传递。它真的很脆,最轻微的东西都会把它弄坏,需要30分钟的调整才能重新开始

最终-我可以固执的自我-我把所有的东西都扔了进去,在大约一天的时间里用JavaScript重新编写了它,用CScript在命令提示符下运行


我没有回头看。尽管现在是MSBuild和Cruise Control,但如果我需要做一些与批处理脚本有关的事情,我会使用jscript。

这取决于您希望如何使用变量。如果只想使用不带引号的变量值,可以使用延迟展开和字符串替换,或使用
for
命令:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"
for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos
正如andynormancx所述,由于字符串包含
&
,因此需要引号。或者你可以用
^
来转义它,但我认为引号有点干净

如果使用带字符串替换的延迟展开,则会得到不带引号的变量值:

@echo !myvar:"=!
>>> C:\my music & videos
您还可以使用
for
命令:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"
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的路径或文件名确实没有干净的方法。

    这取决于您希望如何使用变量。如果只想使用不带引号的变量值,可以使用延迟展开和字符串替换,或使用
    for
    命令:

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        @echo %%P
    )
    >>> C:\my music & videos
    
    set "myvar=c:\my music & videos"
    
    正如andynormancx所述,由于字符串包含
    &
    ,因此需要引号。或者你可以用
    ^
    来转义它,但我认为引号有点干净

    如果您将延迟扩展用于
    C:\Admin>    Echo.%myvar:&=^&%
    C:\my music & videos
    
    C:\Admin>    <nul SET /P="%myvar%"
    C:\my music & videos
    C:\Admin>