首页 > 解决方案 > 如何将 $args 转换为字符串并执行?

问题描述

我想传递给脚本的所有参数并执行。

例如,给定execute.ps1脚本:

Invoke-Expression $($args[0])

我可以跑:

.\execute.ps1 hostname
myhostname

与此脚本的两个参数相同:

Invoke-Expression "$($args[0]) $($args[1])"

并通过以下方式执行它:

.\execute.ps1 echo foo
foo

如何使脚本通用以支持未知数量的参数?

例如:

.\execute.ps1 echo foo bar buzz ...

我尝试了以下失败的组合:

Invoke-Expression $args

调用表达式:无法将“System.Object[]”转换为参数“Command”所需的类型“System.String”。不支持指定的方法。


Invoke-Expression [system.String]::Join(" ", $args)

调用表达式:找不到接受参数“System.Object[]”的位置参数。


Invoke-Expression $args.split(" ")

调用表达式:无法将“System.Object[]”转换为参数“Command”所需的类型“System.String”。不支持指定的方法。


Invoke-Expression [String] $args

调用表达式:找不到接受参数“System.Object[]”的位置参数。

标签: powershellinvoke-command

解决方案


我推荐Bill_Stewart 的回答以避免命令本身(第一个参数)有空格的问题。但即使有这个答案,你也必须小心个别引用论点,但需要注意的是,这本身就是一件复杂的事情


你可以这样做:

 Invoke-Expression "$args"

默认情况下,以这种方式转换为字符串会将其与空格连接(从技术上讲,将其与默认输出字段分隔符连接,即 的值$OFS,默认为空格)。

您也可以按照韦恩的回答进行手动加入。


推荐阅读