我有很多场景需要将参数传递给命令行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相同吗?
答案 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
。
第四次,您只需键入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\"'