85655


オプション等を指定してファイルを一覧で取得するものをPowerShellで作成しています。  
しかしGet-Childitemの部分でパスに無効な文字が含まれていますというエラーがでました。  
@は確認していませんが少なくとも$sに格納したハイフン（-）はだめなようです。  
どのように修正すればよろしいでしょうか。

【sample.ps1の中身】

[code]

    $s = Read-Host "Search-File"
    $files = Get-ChildItem $s
    
[/code]

【windows terminalで上記を試し実行したとき】

[code]

    PS C:\･･･>$s = Read-Host "Search-File"
    Search-File: -Directory -Exclude @("*.jpg", "*.png")
    PS C:\･･･>$files = Get-ChildItem $s
    Get-ChildItem : パスに無効な文字が含まれています
    
[/code]

$sに格納せず直書きしたときは動くのですが、一覧取得先のパスや検索の条件などをこちらで指定したいので直書きは考えていません。

よろしくお願いいたします。


CC BY-SA 4.0
2022-01-12T09:25:45.033
85646
2022-01-12T13:18:27.410
48769
question
powershell
オプション付きでディレクトリ一覧を取得するpowershellファイルを作りたい


直接の回答としてはあまりお勧めしませんが[`Invoke-Expression`](https://docs.microsoft.com/ja-
jp/powershell/module/microsoft.powershell.utility/invoke-
expression?view=powershell-5.1)で文字列の内容を再評価・実行できます。

[code]

    $s = '-Directory -Exclude @("*.jpg", "*.png")'
    $files = Invoke-Expression "Get-ChildItem $s"
    
[/code]

* * *

PowerShell的には[Splatting](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-5.1)をお勧めします。

[code]

    $s = @{ Directory = $true; Exclude = "*.jpg", "*.png" }
    $files = Get-ChildItem @s
    
[/code]

この場合、`Search-File`にはJSONに変換して保存するとよいでしょう。

[code]

    {"Directory":true,"Exclude":["*.jpg","*.png"]}
    
[/code]

としておいて

[code]

    $s = @{}
    (Get-Content "Search-File" | ConvertFrom-Json).PSObject.Properties.ForEach({ $s[$_.Name] = $_.Value })
    $files = Get-ChildItem @s
    
[/code]

（PowerShell 6以降ならもう少し簡単に書けますが…）


CC BY-SA 4.0
2022-01-12T13:18:27.410
85655
2022-01-12T13:18:27.410
4236
85646
answer