如何将环境变量设置为批处理文件中带空格的值?

时间:2009-11-07 21:14:21

标签: batch-file cmd windows-console

我不知道如何准确描述我正在尝试做什么,但这是一个示例批处理文件,演示了我无法弄清楚的内容。:

我有一个批处理文件。在该批处理文件中,我正在尝试创建一个目录:

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来解决问题?

2 个答案:

答案 0 :(得分:6)

只需将表达式放在这样的引号中:

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

注意:它会在引号内扩展变量,如果它也有空格,则需要引用它。

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

md "%TargetDir%\NewSubFolder"

答案 1 :(得分:2)

这里讨论的问题是其他人建议的空格,而是环境变量ProgramFiles(x86)中的右括号这会导致解析器认为该块过早结束({ {3}})。

在这种情况下引用帮助,因为它们使解析器跳过整个引用部分并正确地假设下面的括号是实际的结束部分。但修复可能比那更容易:

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

为什么要使用带括号的块,如果你只做一个命令呢?

set本身不需要任何引号,外,其参数包含<>|,{等特殊字符shell本身可以处理的{1}}。它不是灵丹妙药,但有时会正确处理用户输入或文件内容。

另外,请永远不要在&命令中放置=周围的空格。这将导致创建一个环境变量,其名称以空格结尾,其内容以空格开头。在Windows 7中通过静默创建带有末尾空格的变量和不带:

的变量进行了部分更正
set

但是在Windows的早期版本中,这并没有发生,所以除非你知道这是你想要的,否则永远不要在> set foo = bar > set foo foo=bar foo = bar 周围使用空格: - )