关于PowerShell中使用ArgumentList传递数组

示例

$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) 

  $words -join ' '
  } -ArgumentList $array

输出

Hello

为什么?

因为PowerShell处理的时候使用 数组展开 ,去处理了参数

我们将需要的两个参数$a, $b放在一个数组中传递,PowerShell会自动展开实参数组

$a = $arg[0]
$b = arg[1]

所以,当我们只有一个参数的时候,又传递的是数组,那么这个数组就被展开了,取了数组中的arg[0]作为参数值了。
聪明的你肯定想到好办法了
那我们将数组包在一个数组中,展开外面的数组,arg[0]不就是实际传递的数组吗?

可以看到,并没有起作用,PowerShell会一直展开数组,实际上,你就算包N个数组,它也给你展开(why?!)

方案

既然2个参数的时候能正确展开,那我们就传递2个参数,第一个还是我们需要的,第二个其实无所谓了,它的主要作用就是为了让PowerShell正确展开数组而已

但是写2个参数确实有的不好,官方这么推荐

也没好到哪去...

Ref

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-7.3#using-the-argumentlist-parameter

posted @ 2022-12-12 15:28  talentzemin  阅读(319)  评论(0编辑  收藏  举报