2017-03-14 4 views
2

수백만 개의 파일이 바이너리 형식으로 들어있는 디렉터리가 있습니다. 이 파일 중 일부는 디스크에 잘못 기록되었습니다 (아무런 생각이 없습니다). 파일은 비어 있지 않지만 0 만 포함합니다. 예를 들자면 http://pastebin.com/5b7jHjgrPowershell을 사용하여 0을 포함하는 파일 만 재귀 적으로 검색합니다.

이 디렉토리를 검색해야하며 모두 0 인 파일을 찾아 파일에 기록해야합니다.

필자는 format-hex 및 get-content를 실험 해 왔지만, 제한된 PowerShell 경험으로 인해 나를 걸러 내고 있습니다. Format-Hex는 처음 몇 바이트 만 필요할 때 전체 파일을 읽고 Get-Content는 텍스트 파일을 필요로합니다.

+0

하는 운영 체제에서 스크립트가 실행됩니다 :

다음 코드는 각 파일의 처음 10 바이트를 읽어? – Christophe

+0

@Christophe : 상관 없나요? PowerShell과 BCL은 어떤 경우에도 존재합니다. – Joey

+0

OS에 따라 사전 설치된 PowerShell 버전이 동일하지 않습니다. Zachary가 Windows 7을 사용하다가 PowerShell 버전을 업그레이드하려면 Windows Management Framework를 설치해야합니다. – Christophe

답변

1

당신은 첫 번째 n을 읽어 System.IO.FileStream 객체를 사용할 수 있습니다 각 파일의 바이트.

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 
    } 
} 
+0

음, 완전히 0 바이트로 구성된 파일을 원한다고 생각하면 _n_ 바이트 만 읽으면 충분하지 않을 것입니다. – Joey

+0

Zachary는 "나는 처음 몇 바이트 만 필요합니다"라는 질문에. – Christophe

+0

"처음부터 바로 파일에 대한 단락 회로 작업의 일종으로"나는 모든 0으로 구성되지 않는 파일을 결정하기위한 처음 몇 바이트 만 필요합니다 "라고 이해했습니다. – Joey

3

사용 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 
} 

이전 PowerShell을 2.0 수동으로 필터링해야합니다 대신 -File 매개 변수로는 :

Get-ChildItem r:\1\ -Recurse | Where { $_ -is [IO.FileInfo] } | Where { ..... } 
+0

거기에 BinaryReader에 대한 캐스트가있는 특별한 이유가 있습니까? – Joey

+0

바이트 배열을 반환하는 편리한 ReadBytes() 메서드를 제공하므로 버퍼를 직접 할당하거나 파일 길이를 확인할 필요가 없습니다. – wOxxOm

+0

아, 맞아,'OpenRead'는'FileStream'을 반환합니다. 저는 사실 당신이'BinaryReader'에 그냥 _cast_ 할 수 있다는 것에 놀랐습니다. 아니면 최소한 이것이 [IO.BinaryReader] :: new (...)를 호출하는 것과 동일하다는 것을 알지 못했습니다. – Joey

관련 문제