1

マシン上のすべての jpeg/jpg ファイルを検索する PowerShell スクリプトの作成に取り組んでいます。これは私がこれまでに持っているものです-

# PowerShell script to list the DLL files under the C drive
$Dir = get-childitem C:\ -recurse
# $Dir |get-member
$List = $Dir | where {$_.extension -eq ".jpg"}
$List |ft fullname |out-file C:\Users\User1\Desktop\dll.txt
# List | format-table name

唯一の問題は、探しているファイルの一部に拡張子 jpg/jpeg がないことです。ファイルのヘッダーを確認できることはわかっています。それが ÿØÿà と表示されている場合、それは jpeg/jpg ですが、これをスクリプトに組み込む方法がわかりません。

どんな助けでも大歓迎です。本当にありがとう!

4

6 に答える 6

3

.jpg以下は、拡張子が/のファイル、.jpegまたは最初の 4 バイトに JPEG ヘッダーを含むファイルを取得します。

[Byte[]] $jpegHeader = 255, 216, 255, 224;

function IsJpegFile([System.IO.FileSystemInfo] $file)
{
    # Exclude directories
    if ($file -isnot [System.IO.FileInfo])
    {
        return $false;
    }

    # Include files with either a .jpg or .jpeg extension, case insensitive
    if ($file.Extension -match '^\.jpe?g$')
    {
        return $true;
    }

    # Read up to the first $jpegHeader.Length bytes from $file
    [Byte[]] $fileHeader = @(
        Get-Content -Path $file.FullName -Encoding Byte -ReadCount 0 -TotalCount $jpegHeader.Length
    );

    if ($fileHeader.Length -ne $jpegHeader.Length)
    {
        # The length of the file is less than the JPEG header length
        return $false;
    }

    # Compare each byte in the file header to the JPEG header
    for ($i = 0; $i -lt $fileHeader.Length; $i++)
    {
        if ($fileHeader[$i] -ne $jpegHeader[$i])
        {
            return $false;
        }
    }

    return $true;
}

[System.IO.FileInfo[]] $jpegFiles = @(
    Get-ChildItem -Path 'C:\' -Recurse `
        | Where-Object { IsJpegFile $_; }
);

$jpegFiles | Format-Table 'FullName' | Out-File 'C:\Users\User1\Desktop\dll.txt';

コマンドレット-Encodingのおよび-TotalCountパラメータは、ファイル全体ではなく、各ファイルの最初の 4 バイトのみを読み取るために使用されることに注意してください。これは、基本的にドライブ上のファイル データのすべてのバイトを読み取ることを回避するため、重要な最適化です。Get-ContentC:

于 2013-01-30T23:15:05.130 に答える
3

PowerShell ネイティブ コマンドを使用してファイル ヘッダーを確認する方法がわかりません。面白そうなので、調査を行います。それまでは、最初のコマンドの短いバージョンを提案して、1 行に減らします。

Get-ChildItem -Recurse -include *.jpg | Format-table -Property Fullname | Out-file C:\Users\User1\Desktop\Jpg.txt

また

ls -r -inc *.jpg | ft Fullname

編集済み: 冗長なコードを削除しました。@nick に感謝します。

何か見つけたら、何を見つけたかをお知らせします。

クリス

于 2013-01-30T22:05:49.343 に答える
2

これにより、シーケンス「ÿØÿà」で始まるすべてのファイルが得られます。

$ref = [byte[]]@(255, 216, 255, 224)

Get-ChildItem C:\ -Recurse | ? { -not $_.PSIsContainer } | % {
  $header = [System.IO.File]::ReadAllBytes($_.FullName)[0..3]
  if ( (compare $ref $header) -eq $null ) {
    $_.FullName
  }
} | Out-File "C:\Users\User1\Desktop\dll.txt"
于 2013-01-30T22:33:55.907 に答える
1

ファイルの内容を盗聴するよりも、Windows 検索インデックスで jpeg を検索することをお勧めします。ファイル名を使用したシステム インデックスの検索は非常に高速ですが、インデックス化された場所を検索する必要があるという欠点があります。

Windows sdk \samples\windowssearch\oledb を使用して Windows 検索クエリ スクリプトを作成しました。イメージング プロパティを使用してクエリを実行する必要があります。ただし、検索インデックスがイメージング API を使用して不明なファイルや拡張子のないファイルを検索するかどうかは、頭の中ではっきりしていません。Explorer は jpg 拡張子なしで私の jpeg サムネイルとメタデータを認識しているようです。

于 2013-02-01T22:29:32.833 に答える
1

ヘッダーが ÿØÿà で始まるかどうかを確認するには、次を使用します。

[System.String]$imgInfo = get-content $_ # where $_ is a .jpg file such as "pic.jpg"
if($imgInfo.StartsWith("ÿØÿà"))
{
      #It's a jpeg, start processing...
}

お役に立てれば

于 2013-01-30T22:27:56.763 に答える