传递参数给exe程序

3

我有许多场景需要向命令行exe传递参数。

我看到这个网站上对一些情况进行了回答,但迄今为止我还没有看到关于powershell如何处理参数的稳定、通用的描述——无论是通过cmd还是start-process传递参数。以下是一个微不足道的例子,它让我感到困扰:

以下是bat脚本:

CD /D %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE
devenv /command "File.BatchNewTeamProject C:\stuff\Project51.xml"

我不理解的是,powershell如何解析这些参数。它认为什么是“参数”?
此外,start-process的规则是否与cmd.exe相同?

我不确定是否理解您的疑问。例如,要启动记事本,只需键入“notepad”。从powershell启动可执行文件时传递参数的方式不会改变。您使用可执行文件和批处理命令的方式与旧版“cmd.exe”相同。而cmdlets系列则是完全另一个主题,这是powershell的专属内容,甚至参数管理的方式也不同。 - Emiliano Poggi
PowerShell与NT conhost有一些不同之处。我编写了一个PS脚本,将参数传递给RRDtool,但由于某种原因,RRDtool抱怨无法理解一个完全有效的参数。当从NT控制台运行相同的参数时,它们可以完美地工作。没有引号参与其中。除了传递参数之外,PowerShell还在做一些其他的事情,我不知道是什么。 - user559540
2个回答

1

尝试使用来自PowerShell.com PowerTip的此函数,它演示了Invoke-Expression的用法。

function Call {
  $command = $Args -join " "
  $command += " 2>&1"
  $result = Invoke-Expression($command)
  $result | 
    %{$e=""}{ if( $_.WriteErrorStream ) {$e += $_ } else {$_} }{Write-Warning $e}
}

这会给出:

cd "${env:ProgramFiles(x86)}\Microsoft Visual Studio 10.0\Common7\IDE"
call .\devenv.exe /command "`"File.BatchNewTeamProject C:\stuff\Project51.xml`"

--- 编辑 ---

这里有许多需要说的事情。

首先,您可以通过“about”文件获得帮助,例如:

Get-help about-*

在您感兴趣的主题中,您可以找到:

Get-help about_Quoting_Rules
Get-Help about_Special_Characters
Get-Help about_Escape_Characters
Get-Help about_Parameters

第二点 CD,DIR,MD 可以使用,但它们只是采用不同参数的CmdLets的别名。

第三点 要获取环境变量,不再使用%systemroot%,而是使用$env:systemroot

第四点 要从powershell启动可执行文件,只需键入exe文件的名称:

PS> notepad c:\temp\test.txt

命令行首先由PowerShell解释,因此现在如果您编写:

PS> "C:\Windows\System32\notepad.exe"
C:\Windows\System32\notepad.exe

它只是将其解释为字符串。因此,您可以使用&运算符并编写

PS> & "C:\Windows\System32\notepad.exe" c:\test.txt

它可以工作,但是:

PS> $a = "C:\Windows\System32\notepad.exe c:\test.txt"
PS> & $a

失败和

PS> $a = "C:\Windows\System32\notepad.exe c:\test.txt"
PS> Invoke-Expression $a

工作正常


1
以上代码可以运行,但是让人不安的是将表达式评估为简单传递常见字符串参数。我真的很想更清楚地了解PowerShell解析器如何解释这些值,而不是像Invoke-Expression这样的“黑匣子”来拯救一天。需要注意的是,我有点新手,但我真的不想猜测太多…… - Hotrodmonkey

0

只需像在BAT文件中一样传递参数即可。

cd "$($env:ProgramFiles(x86))\Microsoft Visual Studio 10.0\Common7\IDE"
devenv /command "File.BatchNewTeamProject C:\stuff\Project51.xml"

这将向devenv传递两个参数。

现在,我遇到了一些情况,其中一个应用程序要求字符串中包含引号。我遇到了一些麻烦,认为PowerShell会删除引号。但事实证明,真正的问题是PowerShell不会转义引号。所以你需要这样做。

devenv /command '\"File.BatchNewTeamProject C:\stuff\Project51.xml\"'

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