使用 args 启动进程,其中包含带空格的路径

Posted

技术标签:

【中文标题】使用 args 启动进程,其中包含带空格的路径【英文标题】:Start process with args which contains a path with blanks 【发布时间】:2013-07-07 04:53:09 【问题描述】:

我需要从 powershell 脚本启动一个进程并传递这样的参数: -a -s f1d:\some directory\with blanks in a path\file.iss 为此,我编写了以下代码:

$process = [System.Diagnostics.Process]::Start("$setupFilePath", '-a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"') 
$process.WaitForExit()

因此进程开始但最后一个参数:-f1d:\some directory\with blanks in a path\file.iss 没有正确通过。请帮忙

【问题讨论】:

尝试使用Start-Process cmdlet。 Start-Process -FilePath "yourPath" -ArgumentList "arg1 arg2" 尝试但没有成功。能举个例子吗? 【参考方案1】:

在 PowerShell v3 上,这有效:

& $setupFilePath -a -s -f1:"d:\some directory\with blanks in a path\fileVCCS.iss"

使用PSCX echoargs 命令显示:

25> echoargs.exe -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"
Arg 0 is <-a>
Arg 1 is <-s>
Arg 2 is <-f1d:\some directory\with blanks in a path\fileVCCS.iss>

Command line:
"C:\Program Files (x86)\PowerShell Community Extensions\Pscx3\Pscx\Apps\EchoArgs.exe"  -a -s "-f1d:\some directory\with blanks in a path\fileVCCS.iss"

在 V2 中使用 - 请注意在最后一个双引号中添加反引号:

PS> echoargs.exe -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss`"
Arg 0 is <-a>
Arg 1 is <-s>
Arg 2 is <-f1d:\some directory\with blanks in a path\fileVCCS.iss>

Command line:
"C:\Program Files (x86)\PowerShell Community Extensions\Pscx3\Pscx\Apps\EchoArgs.exe"  -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"

【讨论】:

如果您需要它在 2.0 上工作,请在最后一个双引号之前加一个反引号 `。【参考方案2】:

我觉得你可以用Start-Process:

Start-Process -FilePath $setupFilePath -ArgumentList '-a','-s','-f1"d:\some directory\with blanks in a path\fileVCCS.iss"' |
    Wait-Process

【讨论】:

上面的代码在我的情况下不起作用。它仅在参数 '-f1"d:\some directory\with blanks in a path\fileVCCS.iss"' 包含没有空格的路径时才有效 您能用收到的错误消息更新您的问题吗? 其实没有错误信息。我确定它不能按我的意愿工作,因为如果以不正确的路径启动 $setupFilePath 可执行文件,它可以工作,但以其他方式正常工作。我还尝试通过正确的路径(没有空格)并且它按我想要的方式工作 如果有影响,我正在使用powershell v1 这可能与它有关。尝试使用Process Monitor 到figure out how Start-Process is sending the arguments 到$setupFilePath。可能正在进行某种类型的参数预处理。【参考方案3】:

我理解您的问题是: 如何传递多个参数来启动其中一个参数有空格的进程?

我假设 Windows 批处理文件中的等效项类似于:

"%setupFilePath%" -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"

双引号允许接收进程(本例中为setupFilePath)接收三个参数:

    -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"

要使用您问题中的代码 sn-p 完成此操作,我将使用反引号(在 1 的左侧和转义键下方,不要与单引号混淆;又名 Grave-accent) 转义内部双引号,如下所示:

$process = [System.Diagnostics.Process]::Start("$setupFilePath", "-a -s -f1`"d:\some directory\with blanks in a path\fileVCCS.iss`"") 
$process.WaitForExit()

请注意,除了使用反引号外,我还将参数列表周围的单引号更改为双引号。这是必要的,因为单引号不允许我们在此处需要转义 (http://ss64.com/ps/syntax-esc.html)。

Aaron's answer 应该可以正常工作。如果不是,那么我猜 setupFilePath 没有像您期望的那样解释 -f1"d:\space here\file.ext"

OPINION ALERT 我要添加到他的答案中的唯一一件事是建议使用双引号和反引号,以便允许在参数-f1 的路径中使用变量:

Start-Process -FilePath $setupFilePath -ArgumentList '-a','-s',"-f1`"$pathToVCCS`"" |
Wait-Process

这样一来,您就不会在长行的中间有一个硬编码的绝对路径。

【讨论】:

以上是关于使用 args 启动进程,其中包含带空格的路径的主要内容,如果未能解决你的问题,请参考以下文章

Java程序shell启动脚本文件中路径带空格怎么办?

代码调试篇:gdb调试快速入门指南

Linux下使用ps命令查看某个进程文件的启动位置

Linux下使用ps命令查看某个进程文件的启动位置

带配置文件参数启动Flink任务

Linux下使用ps命令查看某个进程文件的启动位置