使用PowerShell,您可以使用'&'运行另一个应用程序并传入参数的字符。
一个简单的例子。
$notepad = 'notepad'
$fileName = 'HelloWorld.txt'
# This will open HelloWorld.txt
& $notepad $fileName
这很好。但是,如果我想使用业务逻辑来动态生成命令字符串呢?使用相同的简单示例:
$commandString = @('notepad', 'HelloWorld.txt') -join ' ';
& $commandString
我收到错误:
术语'记事本HelloWorld.txt'是 不被认可为的名称 cmdlet,函数,脚本文件或 可操作程序。检查拼写 的名称,或路径是什么 包含,验证路径是否 纠正,然后再试一次。
在我的实例中,我试图动态添加或删除最终命令行字符串的选项。我有办法解决这个问题吗?
答案 0 :(得分:35)
两种方法:
将exe与参数分开。为参数执行所有动态内容,但是使用后面带有参数的变量调用exe正常:
$argument= '"D:\spaced path\HelloWorld.txt"'
$exe = 'notepad'
&$exe $argument
#or
notepad $argument
如果你有多个参数,你应该把它作为一个数组,如果它将与调用的exe部分分开:
$arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2'
$exe = 'notepad'
&$exe $arguments
使用Invoke-Expression。如果所有内容都必须在字符串中,则可以像调用普通表达式一样调用字符串。 Invoke-Expression
也有别名iex
。
$exp = 'notepad "D:\spaced path\HelloWorld.txt"'
Invoke-Expression $exp
在任何一种情况下,参数和exe的内容都应该被引用和格式化,就好像它是直接写在命令行上一样。
答案 1 :(得分:5)
如果你想保留用于构建字符串的逻辑:
$commandString = @('notepad', 'HelloWorld.txt') -join ' '
&([scriptblock]::create($commandstring))