Passing parameters to exe
I have a number of scenarios in which I开发者_StackOverflow中文版 need to pass parameters to command line exes.
I've seen a number of these answered to some extent on this site, but so far I have not seen solid, general purpose, description of how powershell deals with parameters - both being passed by cmd or start-process. Here's one trivial example which bugs me:
Here's the bat script:
CD /D %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE
devenv /command "File.BatchNewTeamProject C:\stuff\Project51.xml"
What I do not understand, is how powershell is parsing these arguments. What does it consider a "parameter"?
Also, are the rules the same for start-process as they are for cmd.exe ?
Try this function coming from PowerShell.com PowerTip it illustrate the usage of Invoke-Expression
.
function Call {
$command = $Args -join " "
$command += " 2>&1"
$result = Invoke-Expression($command)
$result |
%{$e=""}{ if( $_.WriteErrorStream ) {$e += $_ } else {$_} }{Write-Warning $e}
}
That gives :
cd "${env:ProgramFiles(x86)}\Microsoft Visual Studio 10.0\Common7\IDE"
call .\devenv.exe /command "`"File.BatchNewTeamProject C:\stuff\Project51.xml`"
--- Edit ---
There are many things to say here.
First you can find a good help with "about" files try :
Get-help about-*
On the subject you are interested you've got:
Get-help about_Quoting_Rules
Get-Help about_Special_Characters
Get-Help about_Escape_Characters
Get-Help about_Parameters
Second CD, DIR, MD
works, but they are just aliases on CmdLets which takes different arguments.
Third to get environment variable it's no longer %systemroot%
it's $env:systemroot
.
Fourth to start an executable file from powershell you can just type the name of the exe :
PS> notepad c:\temp\test.txt
The command line is first interpreted by powerShell so now if you write :
PS> "C:\Windows\System32\notepad.exe"
C:\Windows\System32\notepad.exe
It just interpret it as a string. So you can use the & operator and write
PS> & "C:\Windows\System32\notepad.exe" c:\test.txt
It works but :
PS> $a = "C:\Windows\System32\notepad.exe c:\test.txt"
PS> & $a
Fails and
PS> $a = "C:\Windows\System32\notepad.exe c:\test.txt"
PS> Invoke-Expression $a
Works
Just pass parameters like you would in your BAT file.
cd "$($env:ProgramFiles(x86))\Microsoft Visual Studio 10.0\Common7\IDE"
devenv /command "File.BatchNewTeamProject C:\stuff\Project51.xml"
That will pass two arguments to devenv.
Now, I have run into a few cases where an application requires that quotes be in the string you pass it. I had some trouble with this and thought that PowerShell was dropping the quotes. But it turns out that the real problem is that PowerShell does not escape the quotes. So you need to do this.
devenv /command '\"File.BatchNewTeamProject C:\stuff\Project51.xml\"'
精彩评论