91059


標題の通りです。  
Powershellで以下のようなコードを組みました。  
仮にソース名を`concatenate_args.ps1`とします。

[code]

    function func1 {
        Param(
            $param1
        )
    
        Write-Host "param1 is '$param1'"
    }
    
[/code]

このソースを`. .\concatenate_args.ps1`を実行して読み込み、  
`func1 -param1 "hoge" + "fuga"`というコマンドを実行しましたが、  
期待した動作になりませんでした。  
期待動作：`param1 is hogefuga`  
実際の動作：`param1 is hoge`

なぜこのような動作になるのか、  
Google検索してもあまり有用な情報にたどり着けておりません。  
ご存じの方、どうかご教示をお願いいたします。


CC BY-SA 4.0
2022-09-12T07:51:34.543
91053
2022-09-12T09:10:34.517
54357
question
powershell
Powershell関数の引数に、"+"で2つの文字列を連結したものを渡そうとしても、先頭の文字列しか渡せない


単純にパラメータ引数をスペース区切りで渡すと別々の引数として受け取る前提に即して動作しています。

[code]

    > function func1 {
    >>    Param(
    >>        $param1
    >>    )
    >>    Write-Host "param1 is '$param1'" 
    >>    $Args  # この行を追加
    >> }
    > func1 "hoge" + "fuga" 
    param1 is 'hoge'
    +
    fuga
    
[/code]

下記の例は上記と同様の結果ですが、少し視点が変わって分かりやすくなるでしょうか。

[code]

    > echo + - * "hoge" "fuga" 
    +
    -
    *
    hoge
    fuga
    
[/code]

期待した動作にする方法はいくつもあります。

[code]

    # $()で変数としてまとめる
    func1 $("hoge" + "fuga")
    
    # 上記と同様
    func1 $(-join("hoge", "fuga"))
    # 先に結合しておく
    $s = "hoge" + "fuga" 
    func1 $s
    
    # "ダブルクォーテーション文字列"の変数展開(sub-expression expansion)
    $s1 = 'hoge'
    func1 "${s1}fuga" 
    
    # 'シングルクォーテーション文字列'を無理やり拡張(ExecutionContext の ExpandString)
    $s2 = 'fuga'
    func1 $ExecutionContext.InvokeCommand.ExpandString('${s1}${s2}')
    
[/code]

**参考資料**

[How do I concatenate strings and variables in
PowerShell?](https://stackoverflow.com/q/15113413)  
[ExecutionContext の ExpandString](https://docs.microsoft.com/ja-
jp/powershell/scripting/learn/deep-dives/everything-about-string-
substitutions?view=powershell-7.2#executioncontext-expandstring)  
[Windows PowerShell Language Specification Version
3.0](https://www.microsoft.com/en-
us/download/details.aspx?id=36389)をダウンロードした資料の"2.3.5.2 String literals"


CC BY-SA 4.0
2022-09-12T09:10:34.517
91059
2022-09-12T09:10:34.517
9820
91053
answer