【问题标题】:Does echo inside "if exists" always requires double quotes in windows command prompt?“如果存在”中的回显是否总是需要在 Windows 命令提示符中使用双引号?
【发布时间】:2017-03-09 23:55:57
【问题描述】:

我正在尝试查找文件是否存在,然后在命令提示符下打印出如下目录:

C:\> if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo C:\Program Files(x86)\Microsoft Visual Studio 14.0\)

这失败并出现以下错误:

\Microsoft was unexpected at this time.

如果我将命令重写为

C:\> if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo "C:\Program Files(x86)\Microsoft Visual Studio 14.0\")

打印出来:

"C:\Program Files(x86)\Microsoft Visual Studio 14.0\"

我利用了这个命令的输出,它周围的引号引起了一些问题。有什么方法可以在不添加引号的情况下回显这个?

【问题讨论】:

  • if 语句中没有引号,或者根本没有引号?因为使用包含空格的路径进行操作需要引号,但如果您关心美观,可以使用变量。
  • if 语句没问题。我说的只是回声。当我从 echo 读取输出并在其他地方使用它时。所以我必须在使用之前手动剥离这些,并且想知道它是否可以在命令本身中完成
  • 问题是echo部分中的括号,(x86)中的结束)被认为是echo前面的(的对应;所以要么删除整个echo命令行周围的(/),或者像^(x86^)(x86^)一样转义(x86)中的括号...
  • Aaah...我假设如果存在 则必须遵循 ()。删除括号工作。谢谢
  • 如果要构建包含多个条件命令的多行块,或者要使用else 子句,则需要括号;对于if 后面的单个命令,它们不是必需的...

标签: batch-file cmd quotes


【解决方案1】:

问题在于echo 部分中的括号,(x86) 中的结束) 被认为是( 前面( 的对应部分。

if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo C:\Program Files(x86)\Microsoft Visual Studio 14.0\)
rem //                                                                         ^                         ^
rem //                                                                         +opening-----------closing+

所以你有两个选择:

  1. 要么删除整个echo 命令行周围的(/)

    if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" echo C:\Program Files(x86)\Microsoft Visual Studio 14.0\
    
  2. 或转义(x86) 中的括号,例如:

    if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo C:\Program Files^(x86^)\Microsoft Visual Studio 14.0\)
    

    或:

    if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo C:\Program Files(x86^)\Microsoft Visual Studio 14.0\)
    

条件命令部分的括号不是必须的,除非:

  1. 你想构建一个多行块:

    if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (
        echo C:\Program Files^(x86^)\Microsoft Visual Studio 14.0\
    )
    
  2. 或者你想使用else子句:

    if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo C:\Program Files^(x86^)\Microsoft Visual Studio 14.0\) else echo ERROR: file not found!
    
  3. 或以上的组合:

    if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (
        echo C:\Program Files^(x86^)\Microsoft Visual Studio 14.0\
    ) else (
        echo ERROR: file not found!
    )
    

有关更多信息,请参阅:IF

【讨论】:

    【解决方案2】:

    aschipfl 的回答已经解释了最多的点。
    但通常您不能或不想转义括号,因为您正在处理具有 unknown 内容的变量,例如 %ProgramFiles%
    当您想在不带引号且不转义的情况下回显它们时,可以使用延迟扩展。

    setlocal EnableDelayedExpansion
    set "dir=!ProgramFiles!"
    if exist "!dir!" (
       echo !dir!
    )
    

    【讨论】:

    • 这是一个有趣的解决方案。但是,如果我将它们用作由 '&' 分隔的单个命令,例如: setlocal EnableDelayedExpansion& set "dir=!ProgramFiles!"& if exist "!dir!" (回声!dir!)
    • @AshishGudla,如果你在批处理文件中使用它,你的代码可以工作,但如果你直接在cmd 中使用它就不行,因为setlocal 在那里没有效果;要在cmd 中启用延迟扩展,请这样做:cmd /V /C set "dir=!ProgramFiles!" ^& if exist "!dir!" echo !dir!
    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多