当传递带引号参数时使用DOS启动命令

5
我有一个关于DOS启动命令的问题。我已经阅读了这个主题:使用具有传递给启动程序的参数的DOS“start”命令,但我的问题有点不同。
我有这个问题:我需要传递需要加引号的路径。
例如,如果路径没有引号,这将很好地工作:
start "" app.exe -option c:\myapp\myfile.txt
但是,如果路径包含双引号,则无法正常工作。
在我的批处理文件中,我有以下行:
start "" myapp.exe -option %mypath%
当%mypath%包含双引号(名称中带有空格或其他字符的路径)时,启动命令会返回非常奇怪的结果。
谢谢 Sandro

3
你或许应该查看 https://dev59.com/KnRB5IYBdhLWcg3wpYqo。 - Gordon Tucker
2个回答

4

通常情况下,使用带引号的参数不是问题,但如果您的应用程序路径也有引号,则会出现问题。

然后您需要添加额外的CALL语句。

start "" app.exe -option c:\myapp\myfile.txt    - Works
start "" app.exe -option "c:\myapp\myfile.txt"    - Works
start "" "app.exe" -option c:\myapp\myfile.txt    - Works

start "" "app.exe" -option "c:\myapp\myfile.txt"    - Don't works
start "" CALL "app.exe" -option "c:\myapp\myfile.txt"    - Works

啊,很好,你正在运行“call”命令,然后将程序和参数传递给它。注意:对于谷歌用户,-option不是通用答案的一部分,它只是因为提问者的问题中有这个选项。 - Andrew
还要注意,您可以事先调用cd "path"。start命令有一个/d选项,用于为其调用的命令/启动的进程设置工作目录。 - Andrew
还要添加CMD /C以防止新打开的窗口挂起,如果您调用一个.bat文件 - START "dummy header" CMD /C CALL "C:\my apps\my.bat" "param - 1" param_2 - it3xl

1

这可能有所帮助,但是它是一个比较绕弯的方法,需要稍作修改以适应您的需求。

思路如下:

  1. 将具有引号的环境变量转储到一个预定义名称的文本文件中。例如:“set mypath2 > withQt.bat”
  2. 使用Windows PowerShell 或某些第三方工具在该文件中查找和替换引号。
  3. 创建另一个文本文件(仅一次步骤),其中包含字符串“Set”
  4. 使用复制命令将步骤2中提到的文件与步骤3中创建的文件附加在一起,并创建一个具有预定义名称的批处理文件。例如:copy base.bat + withQt.bat withtqt.bat
  5. 运行批处理文件,它将创建另一个/替换值没有引号的环境变量。

很抱歉,我暂时无法提供更加优雅的解决方案。


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