在Windows的.cmd文件或批处理文件中设置包含空格的路径变量

140

我新手写脚本,但是无法使这个脚本工作。如果我将文件移到没有空格的路径中,则可以使其工作,但如果可能的话,我想让它在有空格的路径中工作。

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

用于测试的是帮助开关,直到我能否使其正常工作。我可以使用 8.3 文件/文件夹名称(例如 My Documents 转换成 MyDocu~1)来实现,但是否有其他方法呢?


引号必须包含路径和文件名,并且命令行参数必须紧随其后。你能详细说明一下命令行是如何创建的吗?你所说的“如果我在定义中给路径加上引号,cmd.exe会在附加文件名和开关之前加上引号”是什么意思? - vladhorby
10个回答

119

可以尝试这样做:

SET MY_PATH=C:\Folder with a space

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

109

我使用

set "VAR_NAME=<String With Spaces>"

更新路径时:

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

11
这应该是被接受的答案。由于某些原因,如果未将一个带有空格且未加引号的值放入if块中调用set将不起作用。 - Kevin

36

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

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 去掉参数周围的引号。当传递带引号的文件夹名称时,这非常方便,但是在这种特定情况下并不是最佳选择 :-)


我使用了第一种方法,在记事本中使用替换功能。第二种方法似乎过于复杂。谢谢。 - marcerickson
2
我有一个接收参数的批处理文件。使用 set LALA=%~1 对我起作用。 - JCH2k
第二种方法在使用子程序时非常完美。 - robe007

16
尝试这个:
  1. 按照以下方式创建一个变量


    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
    然后用变量替换路径。确保在开头和结尾添加引号。
    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    

8

当我创建 .bat 文件时,我总是用双引号放置路径。(我只添加了 PAUSE 以防止屏幕关闭。)

例如:

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

7
正确的做法如下所示:

@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

5

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

Folder
  └  File1.txt
  └  File2.txt

问题

你说得对,如果在路径周围添加“ ”...

SET RootFolder="C:\Folder with spaces"

如果您想要附加文件名等内容,IT技术会使其无法使用(而不进行一些字符串中间处理)...

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语句 (即在变量名之前)。

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"

5

解决这个问题最简单的方法是将文件夹名用引号括起来:

(cd\New Folder\...) --> (cd\"New Folder"\...)

希望这能帮到你。


2

如果您需要存储永久路径(路径在cmd重新启动时不会更改)

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

  2. 在cmd中输入 setx path "%path%;您的新路径" 然后按回车键

  3. 通过输入path并按回车键来检查路径是否正确


1
我认为,问题不在于PATH变量,而在于路径变量。显然,OP想要将特定的路径存储到一个变量中,并在批处理脚本中使用该值。 - Andriy M

1

尝试添加双斜杠,像这样works for me only。

set dir="C:\\\1. Some Folder\\\Some Other Folder\\\Just Because"

@echo on
MKDIR %dir%

发帖后他们删除了我帖子中的第二个 \ ,所以如果你打开我的评论,它显示三个,你应该将它们看作是两个......


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接