小编Swi*_*ter的帖子

如何从另一个 PS 会话启动新的 PowerShell 会话,并运行带有 splatted 参数的 CmdLet

目标:

是为了能够测试以查看是否安装了 PowerShell v6(可以),如果是,则为某些 CmdLet 调用该 shell。这将在 PowerShell v5.1 中运行的脚本中调用。我无法完全转移到 v6,因为还有其他依赖项在此环境中尚不可用,但是,v6 对某些 CmdLet 进行了重大优化,从而将操作改进了 200 多倍(具体而言,Invoke-WebRequest调用将导致下载一个大文件 - 在 v5.1 中,一个 4GB 的文件需要 1 小时以上才能下载,在 v6 中,使用同一子网上的相同机器,这将需要大约 30 秒。

附加点:

但是,我还建立了一组动态参数,用于插入 CmdLets 参数列表。例如,构建的参数列表将类似于:

$SplatParms = @{
    Method = "Get"
    Uri = $resource
    Credential = $Creds
    Body = (ConvertTo-Json $data)
    ContentType = "application/json"
}
Run Code Online (Sandbox Code Playgroud)

并且运行 CmdLet 通常会按预期工作:

Invoke-RestMethod @SplatParms
Run Code Online (Sandbox Code Playgroud)

已经尝试过的:

在过去的几天里,我查看了这个论坛和其他地方的各种帖子。我们可以创建一个简单的脚本块,它可以被调用并按预期工作:

$ConsoleCommand = { Invoke-RestMethod @SplatParms }

& $ConsoleCommand
Run Code Online (Sandbox Code Playgroud)

但是,尝试在Start-ProcessCmdLet 中传递相同的东西失败了,因为我猜参数哈希表没有被评估:

Start-Process pwsh -ArgumentList "-NoExit","-Command  &{$ConsoleCommand}" -wait
Run Code Online (Sandbox Code Playgroud)

结果是: …

powershell powershell-v6.0

3
推荐指数
1
解决办法
2621
查看次数

标签 统计

powershell ×1

powershell-v6.0 ×1