目标:
是为了能够测试是否安装了 PowerShell v6(没问题),如果是,则为某些 CmdLets 调用该 shell。这将在 PowerShell v5.1 中运行的脚本中调用。我无法完全转换到 v6,因为在此环境中还有其他依赖项尚无法工作,但是,v6 对某些 CmdLets 提供了显着优化,导致操作改进超过 200 倍(具体来说,Invoke-WebRequest
调用将导致下载大文件 - 在 v5.1 中,4GB 文件的下载需要 1 个多小时,在 v6 中,使用同一子网中的相同机器大约需要 30 秒。
附加点:
但是,我还建立了一组动态参数,用于添加到 CmdLets 参数列表中。例如,构建的参数列表看起来像:
$SplatParms = @{
Method = "Get"
Uri = $resource
Credential = $Creds
Body = (ConvertTo-Json $data)
ContentType = "application/json"
}
并且运行 CmdLet 通常会按预期工作:
Invoke-RestMethod @SplatParms
什么已经尝试过:
在过去的几天里,我查看了这个论坛和其他地方的各种帖子。我们可以创建一个可以调用的简单脚本块,也可以按预期工作:
$ConsoleCommand = { Invoke-RestMethod @SplatParms }
& $ConsoleCommand
但是,尝试在Start-Process
CmdLet 中传递相同的东西失败了,因为我猜参数哈希表没有被评估:
Start-Process pwsh -ArgumentList "-NoExit","-Command &{$ConsoleCommand}" -wait
结果是:
Invoke-RestMethod : Cannot validate argument on parameter 'Uri'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
At line:1 char:22
+ &{ Invoke-RestMethod @SplatParms }
下一步去哪儿?
我想我必须以某种方式将参数作为参数传递,以便它们可以被评估和喷溅,但是,语法让我望而却步。我什至不确定是否Start-Process
是最好的 CmdLet 使用,而是我应该寻找其他东西,比如Invoke-Command
,还是完全不同的东西?
将这个 CmdLet 的结果返回到原始 shell 会很棒,但目前,它只需要一些功能。