92306
PowerShellで色々処理をしてくれるGUIを作成しています。  
数ある処理の中で連想配列を必要とする箇所があるため、連想配列を作成する関数を一旦挟み、戻り値としてそれを返すという処理をおこなっています。しかし戻り値として返す段階で手詰まりの状態です。  
関係するコードのみ簡単にかくと下記となります。

```

    # 連想配列作成
    Function makeHashTable{
        Param(
            param1,
            param2
        )
        $HashTable = [System.Collections.Generic.Dictionary[String, PSObject]]::new()
        for($iをインデックス番号でまわす){
            $value = @()
            foreach($v in $values){
                $str = 略
                $value += $str
            }
            $HashTable.Add($List[$i], $value)
        }
        # １
        return $HashTable
    }
    
    # ボタン2の処理
    Function Calc{
        Param(
            $HashTable
        )
        # ３
        $HashTableを使った処理
    }
    
    略
    # 連想配列作成ボタン
    $Button1 = 略
    $Button1.Add_Click({makeHashTable param1 param2})
    
    # 連想配列を渡すボタン
    $Button2 = 略
    $Button2.Add_Click({Calc $HashTable}) # ２
    
```

ボタン１をクリックすると連想配列が作成され、ボタン２をクリックするとその連想配列を使って処理をおこなうというながれです。  
私が試したことは、問題なく実行されるかどうかを１、２、３の部分にWrite-Hostを加えて連想配列を呼び出してみたことです（３についてはCalc
$HashTableをWrite-Host $HashTableに書き換えました）。  
結果は、  
１について 連想配列が作成されている  
２について 連想配列が作成されていない（$HashTable.Countは0）  
３について ２と同じ  
でした。  
以上からmakeHashTableの戻り値として返ってきていないかと思うのですがこれはなぜでしょうか。  
また、どのように修正すべきでしょうか。  
ご助言よろしくお願いいたします。
CC BY-SA 4.0
2022-11-19T04:46:27.550
92305
2022-11-19T05:40:59.530
48769
question
powershell
PowerShellの連想配列を関数の戻り値として返せない
> makeHashTableの戻り値として返ってきていないかと思うのですがこれはなぜでしょうか。

返ってきてはいますが受け取るコードがありません。

根本的には[変数のスコープについて](https://learn.microsoft.com/ja-
jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.3)理解していただくのがいいと思います。

その上で、関数の外側、 `$Button1` や `$Button2` と同じスコープで `$HashTable` を定義するのが無難に思います。

```

    # 連想配列作成
    Function makeHashTable{
        Param(
            param1,
            param2
        )
        for($iをインデックス番号でまわす){
            $value = @()
            foreach($v in $values){
                $str = 略
                $value += $str
            }
            $HashTable.Add($List[$i], $value)
        }
    }
    
    # ボタン2の処理
    Function Calc{
        $HashTableを使った処理
    }
    
    略
    
    # ここで連想配列を作成する
    $HashTable = [System.Collections.Generic.Dictionary[String, PSObject]]::new()
    
    # 連想配列作成ボタン
    $Button1 = 略
    $Button1.Add_Click({makeHashTable param1 param2})
    
    # 連想配列を渡すボタン
    $Button2 = 略
    $Button2.Add_Click({Calc})
    
```

こうなっていれば、 `makeHashTable` `Calc` 双方から参照可能です。
CC BY-SA 4.0
2022-11-19T05:40:59.530
92306
2022-11-19T05:40:59.530
4236
92305
answer