如何将 $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
当然,包含空格的参数仍然需要包含内嵌引号。
我想传递给脚本的所有参数并执行。
例如,给定 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 对我有用。
我推荐
你可以这样做:
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
当然,包含空格的参数仍然需要包含内嵌引号。