动态生成命令行命令,然后使用powershell调用

And*_*erd 28 powershell

使用powershell,您可以使用'&'字符运行另一个应用程序并传入参数.

一个简单的例子.

$notepad = 'notepad'
$fileName = 'HelloWorld.txt'

# This will open HelloWorld.txt
& $notepad $fileName   
Run Code Online (Sandbox Code Playgroud)

这很好.但是,如果我想使用业务逻辑来动态生成命令字符串呢?使用相同的简单示例:

$commandString = @('notepad', 'HelloWorld.txt') -join ' ';
& $commandString
Run Code Online (Sandbox Code Playgroud)

我收到错误:

术语"记事本HelloWorld.txt"未被识别为cmdlet,函数,脚本文件或可操作程序的名称.检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试.

在我的实例中,我试图动态添加或删除最终命令行字符串的选项.我有办法解决这个问题吗?

Joe*_*ant 36

两种方法:

将exe与参数分开.为参数执行所有动态内容,但是在后面持有参数的变量中调用exe正常:

$argument= '"D:\spaced path\HelloWorld.txt"'
$exe = 'notepad'
&$exe $argument

#or
notepad $argument
Run Code Online (Sandbox Code Playgroud)

如果你有多个参数,你应该把它作为一个数组,如果它将与调用的exe部分分开:

$arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2'
$exe = 'notepad'
&$exe $arguments
Run Code Online (Sandbox Code Playgroud)

使用Invoke-Expression.如果所有内容都必须在字符串中,则可以像调用普通表达式一样调用字符串.Invoke-Expression也有别名iex.

$exp = 'notepad "D:\spaced path\HelloWorld.txt"'
Invoke-Expression $exp
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,参数和exe的内容都应该被引用和格式化,就好像它是直接写在命令行上一样.


mjo*_*nor 6

如果你想保持构建字符串的逻辑:

$commandString = @('notepad', 'HelloWorld.txt') -join ' '

&([scriptblock]::create($commandstring))
Run Code Online (Sandbox Code Playgroud)