将参数传递给exe

时间:2011-05-13 14:49:29

标签: .net powershell batch-file

我有很多场景需要将参数传递给命令行exes。

我已经看到其中一些在某种程度上在这个网站上得到了回答,但到目前为止,我还没有看到关于powershell如何处理参数的实用,通用的描述 - 两者都是通过cmd或start-process传递的。这是一个让我烦恼的简单例子:

这是蝙蝠脚本:

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

我不明白,powershell是如何解析这些参数的。它认为什么是“参数”?

此外,启动过程的规则与cmd.exe相同吗?

2 个答案:

答案 0 :(得分: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`"

---编辑---

这里有很多话要说。

首先您可以通过“关于”文件找到一个很好的帮助:

获取帮助 - *

关于你感兴趣的主题你有:

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 :(得分: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\"'