如何将 $args 转换为字符串并执行?

How to convert $args to a string and execute?

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

例如,给定 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

Invoke-Expression : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Command'. Specified method is not supported.


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

Invoke-Expression : A positional parameter cannot be found that accepts argument 'System.Object[]'.


Invoke-Expression $args.split(" ")

Invoke-Expression : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Command'. Specified method is not supported.


Invoke-Expression [String] $args

Invoke-Expression : A positional parameter cannot be found that accepts argument 'System.Object[]'.

$args 是从输入

创建的以空格分隔的字符串数组
   Invoke-Expression -Command "$($args -join " ")"

用空白字符重新加入它,并将它作为字符串传递给 invoke-expression 对我有用。

我推荐 to avoid issues with the command itself (first argument) having spaces. But even with that answer, you would have to be careful to individual quote arguments, with the caveat that that itself itself a complicated thing


你可以这样做:

 Invoke-Expression "$args"

默认情况下,转换为字符串时会用 spaces 连接它(从技术上讲,它与默认输出字段分隔符连接,即 $OFS 的值,默认为 a space).

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

我的建议是避免使用 Invoke-Expression 并改用 &。示例:

$command = $args[0]
$params = ""
if ( $args.Count -gt 1 ) {
  $params = $args[1..$($args.Count - 1)]
}
& $command $params

当然,包含空格的参数仍然需要包含内嵌引号。