Powershell 近似包含演算子はないらしく配列を使う必要があるらしい Powershell Function Approximate inclusion operator Using Array Variables


https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7
https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-if?view=powershell-7
PowerShellでもっといい条件文の書き方５選
https://qiita.com/nimzo6689/items/6c6443a7494674e44949

このなかで

```powershell
function Test01_Good($fruit) {
    # リンゴ、イチゴ、サクランボであれば赤と判定する。
    if ($fruit -in @('リンゴ', 'イチゴ', 'サクランボ')) {
        return '赤'
    }
}

```

```powershell
if ($fruit -in @('リンゴ', 'イチゴ', 'サクランボ')) {
    # もし `$fruit` がリンゴ、イチゴ、サクランボの中に含まれていれば
}

if (@('リンゴ', 'イチゴ', 'サクランボ') -contains $fruit) {
    # もしリンゴ、イチゴ、サクランボが`$fruit`を含んでいれば
}
```

とこのように配列を使う方法が紹介されています。
ところが、リンゴやイチゴやサクランボに似たら赤っぽいと判定する
という使い方はできません。

```powershell
function Test01_Goodlike($fruit) {
    # リンゴ、イチゴ、サクランボであれば赤と判定する。
    # 動かない
    if ($fruit -like @('リンゴ', 'イチゴ', 'サクランボ')) {
        return '赤っぽいかも'
    }
}
```

結から言うと
一つの値に対して複数の値をLikeで比較するためには配列を回す必要がある

```powershell
#近似包含演算子
$ar = @('*リン*', 'イチ*', '*サクラ*')
function Test01_like($fruit) {
    # リンゴ、イ7ゴ、サクランボに近ければ赤と判定する。
    $bl=$false
    for ($i=0;$i -lt $ar.Length;$i++){
    if ($fruit -like $ar[$i] ) {
     Write-Host 'hit' $i
     Write-Host $ar[$i]
       $bl = $true ; Break
    }
    }
   if($bl -eq $true){Return '赤っぽいかも...'}Else{Return 'よくわかりません'} 
}
Test01_like 'イントロクイズ' 
Test01_like 'リン酸' 
Test01_like 'サクラカゲチヨ' 
```

##ところでCountにするとヒットする件
```powershell
#近似包含演算子
$ar = @('*リン*', 'イチ*', '*サクラ*')

function Test01_like($fruit) {
    # リンゴ、イ7ゴ、サクランボに近ければ赤と判定する。
    # この関数はウソです
    $bl=$false
    for ($i=0;$i -lt $ar.length;$i++){
    if ($fruit -like $ar[$i] ) {
     #Write-Host 'hit' $i
     #Write-Host $ar[$i]
       $bl = $true ; Break
    }
    }
   if($bl -eq $true){Return '赤っぽいかも... may be red'}Else{Return 'よくわかりません Sorry, unspeakable Something-like red or not, it is not clear. '} 
}
Test01_like 'イントロクイズ' 
Test01_like 'リン酸' 
Test01_like 'サクラカゲチヨ' 
```

###型指定を[String]にしないように、必ず`[String[]]`配列型指定した方がいいみたいです
[String]にするとなぜか文字列が1文字1文字で配列になります。
このためワイルドカード1文字がHitして何でも近似します。
これをやらかすと[String]を消しても戻りません。
なのでArrayには必ずこれをつけましょう。`[String[]]`
一度間違えると間違えたままになるみたいです。

###使うところ
これを使うのはOfficeの拡張子だけを取り出す場合です
VISIOを別にすると
`@('.doc*', '.xls*', '*.ppt*',`.md?`,`.accd*`, '.pub')`
となります。
get-childitem をカレントのフォルダで実行します。
foreachで拡張子をとって関数に入れます。

```powershell
#包含演算子 Officeのファイルか判定する関数(Visio等は除く)
[String[]]$ar = @('.doc*', '.xls*', '*.ppt*', '.md?', '.acc*', '.pub') #関数は必ずこの配列を使用します
function Test-OfficeFile {
    param(
        [Parameter(Mandatory)]
        [ValidateNotNull()]
        $strExtension
    ) 
    $bl=$false
    for ($i=0;$i -lt $ar.length;$i++){
    if ($strExtension -like $ar[$i] ) {
     #Write-Host 'hit' $i
     #Write-Host $ar[$i]
       $bl = $true ; Break
    }
    }
   if($bl -eq $true){Return $true }Else{Return $false} 
}
### End Function Test-OfficeFile
Get-ChildItem  | ForEach-Object{ Test-OfficeFile $_.Extension}

```

#参考文献
【PowerShell】配列(Array)についてまとめてみる 
https://soma-engineering.com/coding/powershell/what-is-array/2018/05/29/

https://cheshire-wara.com/powershell/ps-textbooks/basic-grammar/array-biginner1/