powershell - 如何使用调用运算符将参数传递给另一个 PowerShell 脚本
问题描述
我有一个 PowerShell 脚本,它将参数收集到一个数组中,然后尝试使用这些参数调用一个可执行文件。
param(
[String] $FileName,
[Parameter(ValueFromRemainingArguments=$true)][String[]] $Arguments
)
& $FileName $Arguments
这在调用简单的可执行文件时效果很好,但在尝试调用另一个需要多个参数的 PowerShell 脚本时会抛出错误。
例外: 无法处理参数“a”的参数转换。无法将值转换为 System.String 类型。
param(
[parameter(mandatory = $true)][string]$a,
[parameter(mandatory = $true)][string]$b,
[parameter(mandatory = $true)][string]$c,
[parameter(mandatory = $true)][string]$d
)
Write-Output ($a + " - " + $b + " - "+ $c + " - "+ $d)
参数的数量是可变的。
我的猜测是,调用运算符(将被调用文件视为 PowerShell 脚本)尝试将数组作为对象传递,而不是拆分参数。我不一定要求助于Invoke-Expression,因为一些参数是由用户提供的,它可能会带来风险
编辑: 我最终做了类似于 Jimmy Robitaille 建议的事情。
$Command = "& $FileName"
foreach ($Arg in $Arguments) {
$Arg = $Arg.Replace("`"", "```"")
if ($Arg.Contains(' ') -or $Arg.Contains(';')) {
$Command += " `"$Arg`""
}
else {
$Command += " $Arg"
}
}
Invoke-Expression $Command
这是我自己创建参数字符串并执行它。我从参数中转义了引号,并将包含空格或带引号的分号的参数包围起来。
解决方案
您可以尝试使用字符串数组的索引而不是传递数组本身,如下所示:
& $FileName $Arguments[0] $Arguments[1] $Arguments[2] $arguments[3]
请注意,如果传递的参数数量少于 4 个,脚本仍然会失败,并且任何超过第 4 个的参数都将被忽略。一些验证也会有所帮助,但这至少可以让您将参数传递给其他脚本而不会出错。
编辑:
在澄清之后,不诉诸调用命令,我能想到的唯一方法是做这样的事情:
powershell.exe `"$FileName`" $($Arguments -join ' ')
您可以尝试解析 FileName 并检查它是否为 PS1,然后使用呼叫运算符或启动 powershell。
推荐阅读
- odac - ODAC 19c 64bit 与 Visual Studio 2019 Enterprise 的连接
- sql - Datediff 和 YYYYMM 转换
- python - 如何替换 JSON 文件中的值?
- c - Valgrind 显示 7 个 allocs 和 7 个 frees,但仍然显示内存泄漏?
- http - 我应该如何在 cpp 中使用 WinHttpSendRequest 格式化标题和正文?
- git - 如何找到谁使用特定的 SHA 提交,谁没有 7 位数字?
- python - ValueError:保存到 PostgreSQL 数据库时,ndarray 不是 Pickle.dumps() 的 C 连续错误
- huggingface-transformers - PyTorch 中的“CUDA 内存不足”
- python - 为什么 Python 不删除这个字符?
- reactjs - React useParams 根本不显示参数,返回具有许多值的对象