8

処理されるすべてのファイルについて、その名前が条件を満たすためにチェックされています。たとえば、次のフィルタのリストがあるとします。

$excludeFiles = @"
aaa.bbb
ccccc.*
ddddd???.exe
"@ | SplitAndTrim;

いずれかの行に一致するファイルは、処理から除外する必要があります。match/regexこのスクリプトは、それを知らない人が変更できる必要があり、実装する必要がある場所がいくつかあるため、回避しようとしています。

$excludedFilesおよび同様のものは、意図的にここの文字列として定義されます。これにより、エンドユーザー/オペレーターはCMD/Powershellウィンドウから一連のファイル名を直接貼り付けることができます。

Powershellは-like配列を受け入れないようですので、次のように書くことはできません。

"ddddd000.exe" -like @("aaa.bbb", "ccccc.*", "ddddd???.exe")

オプションを逃しましたか?Powershellでネイティブにサポートされていない場合、それを実装する最も簡単な方法は何ですか?

4

4 に答える 4

13

受け入れられた回答のパターンの短いバージョンは次のとおりです。

($your_array | %{"your_string" -like $_}) -contains $true

取得したOPのケースに適用

PS C:\> ("aaa.bbb", "ccccc.*", "ddddd???.exe" | %{"ddddd000.exe" -like $_}) -contains $true
True
于 2016-08-12T10:59:50.370 に答える
7

名前のコレクションに対してパターンマッチングを実行することはできますが、パターンのリストに対しては実行できません。これを試して:

foreach($pattern in $excludeFiles)
{
    if($fileName -like $pattern) {break}
}

関数にラップする方法は次のとおりです。

function like($str,$patterns){
    foreach($pattern in $patterns) { if($str -like $pattern) { return $true; } }
    return $false;
}
于 2012-10-22T20:56:25.230 に答える
3

私はあなたがGet-ChildItem -Excludeパラメータを使うことができると思います:

Get-ChildItem $theFileToCheck -exclude $excludeFiles

チェックするファイルの配列がある場合はGet-ChildItem、パスの配列を受け入れます。

Get-ChildItem $filesToCheck -exclude $excludeFiles
于 2012-10-22T22:38:08.143 に答える
0

$ excludeFiles.Where {$ stringToTest -like $ _}

Powershell配列には、式の入力を受け取ることができるWhereメソッドがあるため、()の代わりに{}が使用されます。文字列を入力してテストすると、標準パイプを使用して配列を反復処理するため、$_は配列の要素を表します。

一致する要素のリストを出力します。

PS H:\> $excludeFiles = @("aaa.bbb", "ccccc.*", "ddddd???.exe")
PS H:\> $stringToTest = "ddddd000.exe"
PS H:\> $excludeFiles.Where{$stringToTest -like $_}
ddddd???.exe
于 2019-10-04T18:23:43.560 に答える