我不知道如何准确描述我正在尝试做什么,但这是一个示例批处理文件,演示了我无法弄清楚的内容。:
我有一个批处理文件。在该批处理文件中,我正在尝试创建一个目录:
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来解决问题?
答案 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
周围使用空格: - )