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

ken*_*orb 5 powershell invoke-command

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

例如,给定execute.ps1脚本:

Invoke-Expression $($args[0])
Run Code Online (Sandbox Code Playgroud)

我可以跑:

.\execute.ps1 hostname
myhostname
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Expression "$($args[0]) $($args[1])"
Run Code Online (Sandbox Code Playgroud)

并通过以下方式执行它:

.\execute.ps1 echo foo
foo
Run Code Online (Sandbox Code Playgroud)

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

例如:

.\execute.ps1 echo foo bar buzz ...
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Expression $args
Run Code Online (Sandbox Code Playgroud)

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


Invoke-Expression [system.String]::Join(" ", $args)
Run Code Online (Sandbox Code Playgroud)

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


Invoke-Expression $args.split(" ")
Run Code Online (Sandbox Code Playgroud)

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


Invoke-Expression [String] $args
Run Code Online (Sandbox Code Playgroud)

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

bri*_*ist 9

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


你可以这样做:

 Invoke-Expression "$args"
Run Code Online (Sandbox Code Playgroud)

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

您也可以按照 Wayne 的回答进行手动连接。