powershell - 如何将 $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[]”的位置参数。
解决方案
我推荐Bill_Stewart 的回答以避免命令本身(第一个参数)有空格的问题。但即使有这个答案,你也必须小心个别引用论点,但需要注意的是,这本身就是一件复杂的事情。
你可以这样做:
Invoke-Expression "$args"
默认情况下,以这种方式转换为字符串会将其与空格连接(从技术上讲,将其与默认输出字段分隔符连接,即 的值$OFS
,默认为空格)。
您也可以按照韦恩的回答进行手动加入。
推荐阅读
- ios-charts - iOS 图表库中的自定义 xAxis 格式
- c# - 实体框架核心,在选择中发出/生成表达式
- vb.net - 如何在 WPF VB 中正确设置 BackgroundWorker
- sql - 在标准 SQL 上查找数组位置
- python - 使用单个 plt.bar() 函数设置条形图标签和值
- python - 从列表的每个元素中获取子字符串
- java - 如何使用 Scanner 函数接受多个输入以及满足 if 语句的输入?
- reactjs - 反应:CheckBox 以编程方式检查状态不反映复选框状态
- python - 如何在 Windows 10 下定期在某些 conda 环境中运行 python 脚本?
- python - 如何在使用 functools.wraps 并保留对装饰实例的访问时创建一个带参数的装饰器类