【问题标题】:How do I set an environment variable to a value with spaces in a batch file?如何将环境变量设置为批处理文件中带有空格的值?
【发布时间】:2010-12-14 05:53:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: batch-file cmd windows-console


    【解决方案1】:

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

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

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

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

    md "%TargetDir%\NewSubFolder"
    

    【讨论】:

    • 谢谢,这只是门票,非常感谢。
    • 我从来没有想过我可以在 Set 之后将整个项目用引号括起来......当然,这不是很直观?
    • 不,不直观。 (关于 Windows 命令行的内容不多——这就是我切换到 powershell 的原因)。我是这样想的:“=”的两边都是 set 命令的一个参数。
    • 这种情况下,如何将这个变量发送给函数,然后获取带空格的变量呢? :TEST_FUNCTION %TargetDir%
    【解决方案2】:

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

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

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

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

    set 本身不需要任何引号,除了,当它的参数包含特殊字符时,例如 <>|&,shell 本身可以处理这些字符.它不是灵丹妙药,虽然它有时会让正确处理用户输入或文件内容变得很痛苦。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2011-10-02
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多