5

私が持っているもの

次の作業コードは、スクリプトが配置されているすべてのサブフォルダーからすべてのファイルを一覧表示します。
特定のファイル タイプのみが含まれ、特定の 1 つのフォルダーからすべてのファイルが除外されます。ここまでは順調ですね

$fileInclude = @("*.txt", "*.hgr", "*.dat")           
$folderExclude = "C:\folder2"    
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

gci $scriptPath -recurse -include $fileFilter | Where {$_.FullName -notlike "$folderExclude*"} 

私のテストのファイル構造は次のとおりでした

C:.
│   Myscript.ps1
│
├───folder1
│   │   file1.dat
│   │   file1.hgr
│   │   file1.txt
│   │
│   └───folder3
│           file3.dat
│           file3.hgr
│           file3.txt
│
└───folder2
        file3.dat
        file3.hgr
        file3.txt

私が欲しいもの

今、私は2行目を置き換えたい

$folderExclude = "C:\folder2"

配列で。その後、そこには何十ものパスがあります。

$folderExclude = @(
        "C:\folder2", 
        "C:\folder1\folder3"    
        )

-notlike文字列の配列ではなく文字列を想定しているため、明らかにこれは機能しません。

これを実装する方法が頭に浮かびません。for-each ループが必要だと思いますか?

4

2 に答える 2

6

このルートに行くこともできます:

$exclude = @('c:\folder2*', 'c:\folder1\folder3'} 
gci | Where {$fn = $_.Fullname; ($exclude | Where {$fn -like $_}).count -eq 0}

V4 を使用している場合は、便利な新しい共通パラメーター -PipelineVariable を使用できます。

gci -pv fse | Where {($exclude | Where {$fse.FullName -like $_}).count -eq 0}

このアプローチには、folder1 に folder3foobar というファイルが含まれている場合、そのファイルが除外されるという欠陥があることに注意してください。これを修正するには、除外用語を c:\folder1\folder3* に変更する必要があります。次に、fse.FullName と比較するときに、fse がファイルではなくディレクトリである場合はバックスラッシュを追加する必要があります。

-match左側で配列を許可することに基づいて機能する別のアプローチを次に示します。

 gci | Where {!($exclude -match [regex]::escape($_.Fullname))}

この場合、ディレクトリの 1 つが用語の $exclude 配列と一致する場合、出力があり、それは true に強制されますが、!.

于 2013-11-07T18:26:13.457 に答える
1

1 つの方法は、(代替を使用して) 除外文字列のいずれかに一致する $folderExclude から正規表現を作成し、-notlike の代わりに -notmatch を使用することです。

$folderExclude = @(
    "C:\folder2", 
    "C:\folder1\folder3"    
    )

[regex]$Exclude_regex = ‘(?i)^(‘ + (($folderExclude |foreach {[regex]::escape($_)}) –join “|”) + ‘)’

$fileInclude = @("*.txt", "*.hgr", "*.dat")           
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

gci $scriptPath -recurse -include $fileFilter | Where {$_.FullName -notmatch $Exclude_regex}

編集:これは、ネストされた where-object ほど「ポッシュ」ではないかもしれませんが、大幅に高速になります。

于 2013-11-07T17:39:46.467 に答える