开发者

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:

  1. 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
    
  2. 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 of iex.

    $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))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜