【问题标题】:Set a path variable with spaces in the path in a Windows .cmd file or batch file在 Windows .cmd 文件或批处理文件的路径中设置带有空格的路径变量
【发布时间】:2010-12-23 11:42:49
【问题描述】:

我是脚本编写新手,无法让这个脚本工作。如果我将文件移动到其中没有空格的路径,我可以,但如果可以的话,我希望它与空间一起工作。

我想将一堆 Office 更新提取到带有 .cmd 文件的文件夹中。为了使批处理文件可以在任何计算机上使用,我设置了一个路径变量,我只需在一个地方更改它就可以在另一台机器上运行它。问题是路径中有一个空格。如果我在定义中的路径周围加上引号,cmd.exe 在附加文件名和开关之前将它们放在路径周围,并且批处理失败并出现“命令行语法错误”。没有引号,它会失败,“不被识别为内部或外部命令、可运行程序或批处理文件。”

为了进行测试,我一直在使用帮助开关,直到或者如果我可以让它工作。我可以使用 8.3 文件/文件夹名称(例如 My Documents as MyDocu~1),但可以用不同的方式完成吗?

【问题讨论】:

  • 引号必须包含带有文件名的路径,并且必须跟随命令行参数。您能否提供有关如何创建命令行的更多详细信息?你的意思是什么

标签: batch-file path variables cmd space


【解决方案1】:

试试这样的:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2

【讨论】:

  • 这就是我在记事本中使用 Replace 所做的。谢谢。
  • 很高兴它有帮助。如果您投票并接受您认为对您有帮助的任何答案,那就太好了。
【解决方案2】:

我用

set "VAR_NAME=<String With Spaces>"

更新路径时:

set "PATH=%UTIL_DIR%;%PATH%"

【讨论】:

  • 这应该是公认的答案。出于某种原因,如果值有空格且未加引号,则从 if 块调用 set 不起作用。
【解决方案3】:

这里有两个选项。首先,您可以存储不带引号的路径,然后再引用它:

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something

您可以使用的另一个选项是用于取消引用字符串的子例程(但在这种情况下,这实际上不是一个好主意,因为您要添加引号,将它们剥离并重新添加它们而没有任何好处):

set MyPath="C:\Program Files\Foo"
call :foo %MyPath%
goto :eof

:foo
"%~1\foo.exe"
goto :eof

%~1 删除了参数周围的引号。这在传递引用的文件夹名称时会派上用场,但如前所述,在这种特殊情况下,这不是最好的主意:-)

【讨论】:

  • 我使用了第一种方法,在记事本中使用替换。第二个似乎不必要地复杂。谢谢。
  • 我有一个获取参数的批处理文件。使用set LALA=%~1对我有用。
  • 第二种方法在你使用 subrutines 时效果很好
【解决方案4】:

试试这个;

  1. 如下创建一个变量

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. 然后用变量替换路径。确保为开始和结束添加引号

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    

【讨论】:

    【解决方案5】:

    在创建 .bat 文件时,我总是将路径放在双引号中。 (我只是添加了暂停,所以它不会关闭屏幕。)

    例如:

    "C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
    PAUSE
    

    【讨论】:

      【解决方案6】:

      正确的做法是这样的:

      @ECHO off
      SET MY_PATH=M:\Dir\^
      With Spaces\Sub Folder^
      \Dir\Folder
      :: calls M:\Dir\With Spaces\Sub Folder\Dir\Folder\hello.bat
      CALL "%MY_PATH%\hello.bat"
      pause
      

      【讨论】:

        【解决方案7】:

        解决此问题的最简单方法是将文件夹名称放在引号中:

        (cd\New Folder\...) --&gt; (cd\"New Folder"\...)

        希望这会有所帮助。

        【讨论】:

          【解决方案8】:

          如果需要存储永久路径(重启cmd时路径不改变)

          1. 以管理员身份运行命令提示符(右键单击 cmd.exe 并选择以管理员身份运行)

          2. 在 cmd 中 setx path "%path%;your new path" 然后输入

          3. 输入path并回车检查路径是否正确

          【讨论】:

          • 我认为,问题不在于 PATH 变量,而在于 a path 变量。 OP 显然希望将特定路径存储到变量中并在批处理脚本中使用该值。
          【解决方案9】:

          我最近也遇到了同样的问题,想象一下......

          Folder
            └  File1.txt
            └  File2.txt
          

          问题

          你是对的,如果你在路径周围添加“”......

          SET RootFolder="C:\Folder with spaces"
          

          如果你想附加文件名等,它会使其无法使用(不对字符串进行一些临时处理......

          FOR %%F IN * DO (COPY %%F "%RootFolder%\%%F")
          
          ❌ COPY File1.txt ""C:\Folder with spaces"\File1.txt"
          ❌ COPY File2.txt ""C:\Folder with spaces"\File2.txt"
          

          解决方案

          关键是仍然使用“”,但把它们放在整个SET语句周围(即BEFORE变量名)

          SET "RootFolder=C:\Folder with spaces"
          

          当您需要重复使用变量时,它们会起作用

          FOR %%F IN * DO (COPY %%F "%RootFolder%\%%F")
          
          ✅ COPY File1.txt "C:\Folder with spaces\File1.txt"
          ✅ COPY File1.txt "C:\Folder with spaces\File2.txt"
          

          【讨论】:

            【解决方案10】:

            也可以尝试添加双斜杠 像这样只对我有用

            set dir="C:\\1.Some Folder\\Some Other Folder\\只是因为"

            @echo on MKDIR %dir%

            OMG 在发布后他们删除了我帖子中的第二个\,所以如果你打开我的评论并显示三个,你应该把它们读成两个......

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-08-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-29
              • 1970-01-01
              • 2019-10-31
              相关资源
              最近更新 更多