Dynamically generate command-line command, then invoke using powershell
Using powershell, you can use the '&' character to run another application and pass in parameters.
A simple example.
$notepad = 'notepad'
$fileName = 'HelloWorld.txt'
# This will open HelloWorld.txt
& $notepad $fileName
This is good. But what if I want to use business logic to dynam开发者_如何学Cically generate a command string? Using the same simple example:
$commandString = @('notepad', 'HelloWorld.txt') -join ' ';
& $commandString
I get the error:
The term 'notepad HelloWorld.txt' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
In my real example I'm trying to dynamically add or remove options to the final command line string. Is there a way I can go about this?
Two ways to do that:
Separate the exe from the arguments
Do all your dynamic stuff for the arguments, but call the exe as normal with the variable holding the arguments afterward:
$exe = 'notepad' $argument = '"D:\spaced path\HelloWorld.txt"' &$exe $argument #or notepad $argument
If you have more than one argument, you should make it an array if it will be separate from the exe part of the call:
$exe = 'notepad' $arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2' &$exe $arguments
Use Invoke-Expression
If everything must be in a string, you can invoke the string as if it were a normal expression.
Invoke-Expression
also has the alias ofiex
.$exp = 'notepad "D:\spaced path\HelloWorld.txt"' Invoke-Expression $exp
In either case, the contents of the arguments and of the exe should be quoted and formatted appropriately as if it were being written straight on the commandline.
If you want to keep that logic for building your strings:
$commandString = @('notepad', 'HelloWorld.txt') -join ' '
&([scriptblock]::create($commandstring))
精彩评论