0

私はそれが正しいと確信していますが、コミュニティで再確認したいと思います. 私は、そこから始まるフォルダー構造を持っています。たとえば、そこからc:\test\多くのファイルとフォルダーがあります。この構造にはフォルダーもあります。たとえばc:\test\something\another\temp\、このフォルダーとそのサブフォルダーが .xml ファイルの約 50% 以上を占めていますc:\test\

*.txtにあるすべてのファイルc:\test\とそのサブフォルダーのリストを取得したいと思いますc:\test\something\another\temp\

c:\test\something\another\temp\パフォーマンス上の理由から、すべてを列挙してからパイプアウトしてフィルター処理したくはc:\test\something\another\temp\ありません。ツリー全体を調べる必要はありません。そこには関心のあるものが何もないからです。

ここでコマンドレットが役立つようには見えませんGet-ChildItem。.NET 呼び出しに頼って、自分で再帰を記述して、不要なフォルダーを除外する必要があります。

Get-ChildItemパラメーターがあり-Excludeますが、フォルダーでは機能せず、ファイルでのみ機能します。

私は .NET ライブラリを呼び出すことに問題はありません。何かが欠けていないことを確認したいだけであり、在庫の PowerShell コマンドレットを使用してこれを行う <簡単な> 方法はありません。

ある?

4

4 に答える 4

3

ディレクトリが非常に大きい場合は、

(cmd /c dir c:\test\*.txt /b /s) -notlike 'c:\test\something\another\temp\*'

get-childitem よりもはるかに迅速な結果が得られるはずです。

編集:

除外されたディレクトリを検索しない別のバージョンを次に示します。

$files = 
(cmd /c dir c:\test /b /s /ad) -notlike 'c:\test\something\another\temp*' |
 foreach { iex "cmd /c dir $_\*.txt /b /s /a-d"  }

それよりも早く入手する方法がわかりません。

于 2013-11-06T21:21:08.507 に答える
1

または、次のようにすることもできます。

Get-ChildItem C:\test -r *.txt | Where {$_.FullName -notlike 'c:\test\something\another\temp\*'}
于 2013-11-06T21:07:13.723 に答える
0

パイプラインを利用する別のオプション:

function Get-FilesInDir {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true)]
        $Path,
        $Exclude
    )

    Process {
        $Path | ForEach-Object {
            if( (Resolve-path $_).Path.StartsWith($Exclude) ) { return }

            Get-ChildItem -Path:$_ |
                ForEach-Object { 
                    if($_.PSIsContainer) { Get-FilesInDir -Path:$_.FullName -Exclude:$Exclude }
                    $_.FullName
                }
        }
    }
}
于 2013-11-06T22:08:00.810 に答える
0

これを行うには、自分自身を再帰的に呼び出す独自の関数を作成し、見たくないディレクトリをスキップします。.NET Framework メソッドに頼るのではなく、組み込みのコマンドレットを使用するだけで、頭の中で思い描いていることを実行していると思います。

$searchroot = 'c:\test';
function Get-FilesInDir {
param (
    $DirToSearch
)
    $ItemsInDir = Get-ChildItem -path $DirToSearch;
    foreach ($item in $ItemsInDir) {
        if ($item.FullName -eq 'c:\test\something\another\temp') {
            continue;
        }
        if ($item.PSIsContainer) {
            Get-FilesInDir $item.FullName;
        }
        $item.FullName;
    }
}

Get-FilesInDir $searchroot

これにより、見つかった各ファイルへのフル パスが出力されます。

除外したいディレクトリのリストがある場合は、それらを配列に入れ、各パスをチェックしてその配列にあるかどうかを確認するようにifテストを変更できます。continue

于 2013-11-06T20:59:58.837 に答える