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

mar*_*son 101 variables cmd space path batch-file

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

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

为了测试,我正在使用帮助开关,直到或者如果我可以使它工作.我可以使用8.3文件/文件夹名称(例如我的文档作为MyDocu~1)来完成它,但它可以以不同的方式完成吗?

aph*_*ria 93

尝试这样的事情:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2
Run Code Online (Sandbox Code Playgroud)

  • 很高兴它有所帮助.如果你赞成并接受你认为帮助你的任何答案,那将是很好的. (4认同)

小智 63

我用

set "VAR_NAME=<String With Spaces>"
Run Code Online (Sandbox Code Playgroud)

更新路径时:

set "PATH=%UTIL_DIR%;%PATH%"
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。由于某种原因,如果值有空格且未加引号,则从 if 块调用 set 不起作用。 (5认同)

Joe*_*oey 31

这里有两个选择.首先,您可以存储未加引号的路径,稍后再引用它:

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something
Run Code Online (Sandbox Code Playgroud)

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

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

:foo
"%~1\foo.exe"
goto :eof
Run Code Online (Sandbox Code Playgroud)

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

  • 我有一个获取参数的批处理文件.使用`set LALA =%~1`对我有用. (2认同)

小智 15

试试这个;

  1. 创建一个变量如下

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

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    
    Run Code Online (Sandbox Code Playgroud)


JoB*_*ter 7

在创建.bat文件时,我总是将路径放在双引号中.(我刚刚添加了PAUSE,因此它不会关闭屏幕.)

例如:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE
Run Code Online (Sandbox Code Playgroud)


dja*_*fan 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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

希望这会有所帮助。


Mar*_*tin 5

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

\n
Folder\n  \xe2\x94\x94  File1.txt\n  \xe2\x94\x94  File2.txt\n
Run Code Online (Sandbox Code Playgroud)\n

问题

\n

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

\n
SET RootFolder="C:\\Folder with spaces"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
FOR %%F IN * DO (COPY %%F "%RootFolder%\\%%F")\n\n\xe2\x9d\x8c COPY File1.txt ""C:\\Folder with spaces"\\File1.txt"\n\xe2\x9d\x8c COPY File2.txt ""C:\\Folder with spaces"\\File2.txt"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

解决方案

\n

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

\n
SET "RootFolder=C:\\Folder with spaces"\n
Run Code Online (Sandbox Code Playgroud)\n

当您需要重新使用变量时,这将起作用

\n
FOR %%F IN * DO (COPY %%F "%RootFolder%\\%%F")\n\n\xe2\x9c\x85 COPY File1.txt "C:\\Folder with spaces\\File1.txt"\n\xe2\x9c\x85 COPY File1.txt "C:\\Folder with spaces\\File2.txt"\n
Run Code Online (Sandbox Code Playgroud)\n