在cmd中处理路径名中的空格

在cmd中处理路径名中的空格,cmd,parameter-passing,Cmd,Parameter Passing,当我将mu.bat更改为绝对路径名为mu.bat时,可以找到批处理文件: C:\Program Files\mu-repo>mu python: can't open file 'C:\Program': [Errno 2] No such file or directory C:\Program Files\mu-repo>cat mu.bat @echo off python %~dp0\mu %* 如何继续使用%~dp0,而不使用绝对路径名替换它 谢谢。将mu.bat更改

当我将
mu.bat
更改为绝对路径名为
mu.bat
时,可以找到批处理文件:

C:\Program Files\mu-repo>mu
python: can't open file 'C:\Program': [Errno 2] No such file or directory


C:\Program Files\mu-repo>cat mu.bat
@echo off
python %~dp0\mu %*
如何继续使用
%~dp0
,而不使用绝对路径名替换它


谢谢。

mu.bat
更改为以下内容:

C:\Program Files\mu-repo>cat mu.bat
@echo off
python "C:\Program Files\mu-repo"\mu %*

C:\Program Files\mu-repo>mu
Commands:

* mu register repo1 repo2: Registers repo1 and repo2 to be tracked.
* mu register --all: Registers all subdirs with .git (non-recursive).
  • 封闭的
    “…”
    确保路径被识别为单个参数,即使它包含空格

  • 请注意,我已将
    n
    添加到
    %~dp0
    ,这将批处理文件的根文件名(不带扩展名的文件名)
    mu
    ,在本例中,将其添加到生成的路径中,从而总体上生成
    C:\Program Files\mu repo\mu

一些旁白:

  • 表达式的语法,如
    %~dp0
    -对
    %0
    的修改引用,其中包含调用的批处理文件的路径-在运行
    帮助调用时解释

    正如在对该问题的评论中指出的那样,
    d
    部分扩展到目录路径,包括一个尾随的
    \
    ,因此不需要附加一个

  • 不要用双引号(
    “%*”
    )来传递所有参数,因为这会导致不同的命令行-只需按原样使用(
    “%*”

  • 允许在单个参数中混合使用双引号部分和非引号部分;鉴于
    mu
    本身不需要双引号,因此
    “%~dp0”mu
    “%~dp0mu”
    都可以工作


将路径/文件名用双引号括起来:
“%~dp0”
,甚至可能是
“%*”
,请将整个路径/文件名,而不仅仅是其中的一部分括起来:
python“C:\Program Files\mu repo\mu.bat”%*
python“%~dp0mu.bat”%*
python“%~dp0mu”%*
(请注意,
%~dp0
本身已经被
\
结束了)@Stephan:在传递参数时,不要重复引用
%*
,它会更改命令行。虽然重复引用整个参数肯定不会有什么坏处,但通常不需要;在这种情况下,它不是。@mklement0:因此我说“可能”-很大程度上取决于需要什么。
@echo off
python "%~dpn0" %*