kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

PowerShellのForeach-object parallel内でインデクサを使う

docs.microsoft.com

PowerShell 7で導入されたForeach-Object -parallelちょっと用事があってこんな感じで使おうとしました。

$outervalue = 1,2,3
$array = 10,20

$array | foreach-object -parallel {
  for($i = 0; $i -lt $using:outervalue.length;$i++){
     write-host $_ * $using:outervalue[$i]
  }
}

すると…

ParserError:
Line |
   3 |       write-host $_ * $using:outervalue[$i]
     |                                         ~~
     | Expression is not allowed in a Using expression.

こんな式は認められないと怒られました。

github.com

原因はここで書かれているのですが、parallel内の式ではオブジェクトが読み取り専用になるために、インデクサを指定するとだめなのだそうです。なので、GetValueを使って参照することになります。

$outervalue = 1,2,3
$array = 10,20

$array | foreach-object -parallel {
  for($i = 0; $i -lt $using:outervalue.length;$i++){
     write-host $_ * ($using:outervalue).GetValue($i)
  }
}

いわれてみればそうだなぁという仕様ですが、結構悩みました。