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

4

2 回答 2

6

只需将您的表达式放在引号中,如下所示:

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

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

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

md "%TargetDir%\NewSubFolder"
于 2009-11-07T21:28:28.433 回答
3

这里的问题不是其他人建议的空格,而是环境变量中的右括号ProgramFiles(x86)这导致解析器认为该块过早结束(无耻的自我推销)。

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

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

如果您所做的只是将一个命令放入其中,为什么还要使用带括号的块?

set它本身不需要任何引号,除非它的参数包含特殊字符,如<, >, |&shell 本身可以处理这些字符。它不是灵丹妙药,尽管它有时会导致正确处理用户输入或文件内容成为一种痛苦。

另外,请永远不要=set命令中放置空格。这将导致创建一个环境变量,其名称以空格结尾,其内容以空格开头。这在 Windows 7 中通过静默创建最后带有空格的变量和不带空格的变量在 Windows 7 中得到部分纠正:

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

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

于 2009-11-13T08:35:23.627 回答