路径中有空格和参数中也有空格的批处理文件无法运行的问题

21

我正在尝试运行一个批处理文件,它位于:

C:\Test Batch\BatchTest.bat

这将会从指定的另一个位置复制文件,比如说

C:\Users\UserName\Desktop\Company Downloads\downloadedDoc.doc

我可以像这样运行批处理文件:

cmd  /c start "" "C:\Test Batch\TestBatch.bat"

批处理实际上是可以运行的。

但当我尝试像这样添加一个要复制的参数时:

cmd  /c start "" "C:\Test Batch\TestBatch.bat" "C:\Users\User Name\Desktop\Company Downloads\downloadedDoc.doc"

我得到:

'C:\Test' is not recognized a an internal or external command, operable program or batch file.

最终批处理文件和要复制的文件将由用户指定,文件名或路径中可能会有空格。因此,简单地使用没有空格的路径的答案是不够的。

2个回答

17

尝试使用 /d 参数更改启动目录,像这样开始:

cmd /c start "" /d"C:\Test Batch\" "TestBatch.bat" "C:\Users\User Name\Desktop\Company Downloads\downloadedDoc.doc"

start命令在解析引号时有一些奇怪的问题。


谢谢您的快速回复。我今天必须让它工作。我尝试使用双引号,就像您上面提到的一样。但现在我得到一个Windows弹出窗口,上面写着“Windows无法找到'C:\ Test'。确保您正确输入了名称,然后重试。”我还想知道这是否会影响我使用Runtime.exec(String [])在Java中运行此代码,因为我可能会遇到嵌入式引号错误。 - tfontana
好消息是,Runtime.exec(String [])方法不会在意额外的引号。但我仍然遇到了与上面相同的错误。我知道这不是打字错误,因为我正在浏览这些文件以获取应用程序中的路径和名称。我正在运行64位的Windows 7。 - tfontana
是的,我试了一下,使用带引号的可执行路径和带引号的参数传递给start,在任何引号配置下都无法正常工作,直到我使用/d参数来更改start的工作目录。已更新上面的答案。 - Egg
谢谢!这个命令提示符对我有用。现在我只需要将路径和批处理文件分别解析为字符串(这很容易),我想我就可以了。 - tfontana

13

这是启动由start.exe启动的cmd.exe的一个已知特性。只有当命令的名称或路径中包含空格并且至少有一个参数带引号时,才会发生这种情况。

解决方法是用call替换命令。

start "" CALL "C:\Test Batch\TestBatch.bat" "C:\Users\User Name\down.doc"

2
这应该是正确的答案...被接受的那个太长了,需要事先知道工作目录,而对我来说是不可能的。 - Billy Cao
在我看来,这似乎不是命令路径/名称中的空格,而是必须加引号才能引起这个奇怪的问题... - aschipfl

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