Saya memiliki direktori yang berisi jutaan file dalam format biner. Beberapa file ini salah ditulis ke disk (tidak tahu caranya). File tidak kosong, tetapi hanya berisi nol. Berikut contoh http://Pastebin.com/5b7jHjgr

Saya perlu mencari direktori ini, menemukan file yang semuanya nol dan menulis jalurnya ke file.

Saya telah bereksperimen dengan format-hex dan get-content, tetapi pengalaman powershell saya yang terbatas membuat saya tersandung. Format-Hex membaca seluruh file, ketika saya hanya membutuhkan beberapa byte pertama, dan Get-Content mengharapkan file teks.

2
Zachary Bonjour 14 Maret 2017, 18:10

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan System.IO.FileStream objek untuk membaca n byte pertama dari setiap file.

Kode berikut membaca sepuluh byte pertama dari setiap file:

Get-ChildItem -Path C:\Temp -File -Recurse | ForEach-Object -Process {

    # Open file for reading
    $file = [System.IO.FileStream]([System.IO.File]::OpenRead($_.FullName))

    # Go through the first ten bytes of the file
    $containsTenZeros = $true
    for( $i = 0; $i -lt $file.Length -and $i -lt 10; $i++ )
    {
        if( $file.ReadByte() -ne 0 )
        {
            $containsTenZeros = $false
        }
    }

    # If the file contains ten zeros then add its full path to List.txt
    if( $containsTenZeros )
    {
        Add-Content -Path List.txt -Value $_.FullName
    }
}
1
Chris 15 Maret 2017, 08:41

Gunakan IO.BinaryReader:

Get-ChildItem r:\1\ -Recurse -File | Where {
    $bin = [IO.BinaryReader][IO.File]::OpenRead($_.FullName)
    foreach ($byte in $bin.ReadBytes(16)) {
        if ($byte) { $bin.Close(); return $false }
    }
    $bin.Close()
    $true
}

Di PowerShell 2.0 lama alih-alih parameter -File, Anda harus memfilternya secara manual:

Get-ChildItem r:\1\ -Recurse | Where { $_ -is [IO.FileInfo] } | Where { ..... }
3
wOxxOm 14 Maret 2017, 15:29