如何将数组传递给函数?

How do i pass an array into a function?

我下面有以下代码,它将获取一个数组并将相关的像素颜色写出到 powershell window。数组本身就是为了形成一个图像。此时我仅以一张图像为例,但打算添加更多数组以生成更多图像。当那个时候到来时,我希望能够将该数组传递给函数以将其绘制出来。因为我现在有我的代码,所以我收到一条错误消息

“无法索引到空数组”

如何正确地将 Array 对象传递给函数?

$Colors = @{
    1         =   'White'               
    2         =   'Black'         
    3         =   'DarkBlue'    
    4         =   'DarkGreen'     
    5         =   'DarkCyan'      
    6         =   'DarkRed'       
    7         =   'DarkMagenta'   
    8         =   'DarkYellow'    
    9         =   'Gray'          
    10        =   'DarkGray'      
    11        =   'Blue'          
    12        =   'Green'         
    13        =   'Cyan'          
    14        =   'Red'           
    15        =   'Magenta'       
    16        =   'Yellow'         
}

$omg  =   @(2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1), 
          @(2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2),
          @(2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,1,1,1,2,2,2),
          @(2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,1,1,1,2,2,2),
          @(2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,1,1,1,2,2,2),
          @(2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,2),
          @(2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2),
          @(2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1),
          @(2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1),
          @(2,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,2,2,1,1,1,1),
          @(2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
          @(2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
          @(2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2),
          @(2,2,2,2,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,2,2),
          @(2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2),
          @(2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2),
          @(2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2),
          @(2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2)


Function PS-Draw { 
[CmdletBinding()]

param ( 
[Parameter (Mandatory = $True, ValueFromPipeline = $True)]
[Alias("I")]
$Image

)

cls
       
foreach ($row in $Image)
{
  foreach ($position in $row) {
    Write-Host "  " -NoNewline -BackgroundColor $Colors[$position]; Start-Sleep -m 10
  }
  Write-Host ""
}
}

PS-Draw -Image $omg

只需将 Image 参数转换为 [array][object[]] 并删除 ValueFromPipeline = $True:

function PS-Draw { 
    [CmdletBinding()]
    param ( 
        [Parameter (Mandatory = $True)]
        [Alias("I")]
        [array]$Image
    )

    cls
   
    foreach ($row in $Image) {
      foreach ($position in $row) {
        Write-Host "  " -NoNewline -BackgroundColor $Colors[$position]
        Start-Sleep -m 10
      }
      Write-Host ""
    }
}

由于该函数不再通过管道接收输入,您需要使用

调用它
PS-Draw -Image $omg

或者,如果您确实希望能够通过管道将数组发送到函数,请执行:

function PS-Draw { 
    [CmdletBinding()]
    param ( 
        [Parameter (Mandatory = $True, ValueFromPipeline = $True)]
        [Alias("I")]
        [object[]]$Image
    )

    # if the data is sent through the pipeline, use $input to collect is as array
    if ($PSCmdlet.MyInvocation.ExpectingInput) { $Image = @($input) }

    cls
   
    foreach ($row in $Image) {
      foreach ($position in $row) {
        Write-Host "  " -NoNewline -BackgroundColor $Colors[$position]
        Start-Sleep -m 10
      }
      Write-Host ""
    }
}

现在您也可以使用

调用该函数
$omg | PS-Draw

结果: