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

时间:2011-07-06 23:06:22

标签: powershell

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

一个简单的例子。

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

# This will open HelloWorld.txt
& $notepad $fileName   

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

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

我收到错误:

  

术语'记事本HelloWorld.txt'是   不被认可为的名称   cmdlet,函数,脚本文件或   可操作程序。检查拼写   的名称,或路径是什么   包含,验证路径是否   纠正,然后再试一次。

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

2 个答案:

答案 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))