2009-11-07 154 views
6

我不知道如何描述我正在尝试做什么,但这里是一个示例批处理文件,演示了我无法弄清楚的事情:如何将环境变量设置为批处理文件中的空格值?

我有一个批处理文件。内部的批处理文件,我试图创建一个目录:

Set CopyFrom = %~dp0 

if Exist "%ProgramFiles(x86)" (
    Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces 
) 

md %TargetDir%\NewSubFolder 
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder 

我的批处理文件第4行Set TargetDir =...与失败:

\My was unexpected at this time 

我假设这是因为我有我的空间路径名称。我想我可能只是换我的变量与报价:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces" 

但是当我去创建它失败,因为%TargetDir%现在包裹在引号中的目录就行了。 md "%TargetDir%"\NewSubFolder

这可以修复吗?或者我应该写一个VBScript来解决问题吗?

回答

6

只要把你的表达引号是这样的:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces" 
C:\>echo %TargetDir% 
C:\Program Files\My Directory Name has spaces 

注:将扩大该变量的引号内,如果它也有空间,它需要被引用。

现在你可以给它来执行你的操作:

md "%TargetDir%\NewSubFolder" 
+0

谢谢,这只是票,非常感谢。 – BobTheBuilder 2009-11-07 21:42:36

+0

从来没有想过我可以将整个项目包在引号之后......当然,这不完全直观吗? – BobTheBuilder 2009-11-07 21:43:44

+0

不,不直观。 (没有太多关于Windows命令行 - 这就是为什么我切换到PowerShell)。我认为它是这样的:“=”的两边是set命令的单个参数。 – zdan 2009-11-07 23:03:04

2

问题这里的问题是的空间为其他人则建议,而是在环境变量ProgramFiles(x86)右括号这将导致解析器认为该块过早结束(shameless self-promotion)。

行情帮助在这种情况下,因为他们使解析器跳过整个引用的部分,并正确地假定下面的括号是实际关闭的一个。但修复可能比这更简单:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces 

为什么要使用一个括号块在所有如果你做到这一点恰好放一个命令成吗?

set本身并不需要任何报价,除了当它的参数包含像<>|&其外壳本身AREADY处理特殊字符。这不是万能的,尽管这使得正确处理用户输入或文件内容有时会很痛苦。

另外,千万不要在=set命令中输入空格。这将导致创建一个环境变量,其名称名称以空格结尾,其内容以空格开头。

> set foo = bar 
> set foo 
foo=bar 
foo = bar 

但在Windows中,这个以前的版本并没有发生,所以从来没有使用=,除非周围的空间:这是部分在Windows 7中通过不默默地既创造,并在后面的空间变量和一个修正你知道这是你想要的:-)

相关问题