【问题标题】:Dynamically generate command-line command, then invoke using powershell动态生成命令行命令,然后使用powershell调用
【发布时间】:2011-09-30 01:14:22
【问题描述】:

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

一个简单的例子。

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

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

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

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

我得到错误:

“记事本 HelloWorld.txt”一词是 不被识别为一个名字 cmdlet、函数、脚本文件或 可运行的程序。检查拼写 的名称,或者如果路径是 包括,验证路径是 正确并重试。

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

【问题讨论】:

  • 用双引号 ("") 引用有帮助吗?

标签: powershell


【解决方案1】:

两种方法:

将 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 的内容都应该被引用并适当地格式化,就好像它是直接在命令行上编写的一样。

【讨论】:

  • 还要注意,您需要自己在单个字符串中引用参数以确保它们被正确传递。
  • 谢谢。这个问题给了我三个可用的替代方案,但我最终选择了“将 exe 与参数分开”路径。
  • @Andrew:我大部分时间也使用这种方法,因为大多数语言在启动其他进程时都有类似的分隔。
  • 感谢 Invoke-Expression。不知道它的威力
  • 如果我在可执行文件中有空格,则调用表达式不起作用,例如 '"c:\myprograms\notepad.exe" "D:\spaced path\HelloWorld.txt"' 我得到了错误“语句表达式中出现意外标记”
【解决方案2】:

如果您想保留构建字符串的逻辑:

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

&([scriptblock]::create($commandstring))

【讨论】:

  • 这确实会保留参数中的空格,因此不适用于“Hello World.txt”
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2012-08-25
  • 2021-12-24
  • 2015-04-22
相关资源
最近更新 更多