Icebird

Delphi/C# - My favorite programming language

My Links

Blog Stats

[PowerShell] SFV生成与校验

# Author: Icebird@cnblogs
#
 Purpose: Check-SFV (csfv) and Make-SFV (msfv)

function Global:Check-SFV([string]$filename = "")
{
trap
{
  
$_.InvocationInfo
  write
-host ("{0,-17:S}{1} {2}" -f "Exception"":"$_.Exception.Message)
  
break
}

    
if (($filename.Length -eq 0-or !($filename -match ".sfv$"))
    {
        
return "Usage: Check-SFV filename.sfv"
    }
    dir 
$filename > $null
    
$sfv = type $filename | ? {$a = $_.Trim(); ($a.Length -gt 0-and !($a -match "^[#;]")}
    [hashtable] 
$table = @{}
    [regex] 
$regex = "^(.+)`\s+([0-9a-zA-Z]+)$"
    
$sfv | % {
        
$m = $regex.matches($_)
        
if (($m.Count -gt 0-and $m[0].Success)
        {
            
$table.Add($m[0].Groups[1].Value, $m[0].Groups[2].Value)
        }
    }
    
$path = split-path($filename)
    
if ($path.Length -gt 0)
    {
        
$path += "\"
    }
    
$table.Keys | sort | % {
        
$file = "$path$_"
        
$crc = $table[$_].ToUpper()
        
$regex = "bytes[)] is 0x(.{8,8})"
        
$r = CRC "$file"
        
$m = $regex.matches($r)
        
if (($m.Count -gt 0-and $m[0].Success)
        {
            
if ($m[0].Groups[1].Value -eq $crc)
            {
                echo 
"$file is OK"
            }
            
else
            {
                echo 
"$file is damaged"
            }
        }
        
else
        {
            echo 
"$file is missing"
        }
    }
}

function Global:Make-SFV([string]$path = "",[string]$filename = "")
{
trap
{
  
$_.InvocationInfo
  write
-host ("{0,-17:S}{1} {2}" -f "Exception"":"$_.Exception.Message)
  
break
}
    
if ($path.Length -eq 0)
    {
        
return "Usage: Make-SFV path [filename.sfv]"
    }
    
$files = (dir $path -exclude *.sfv | ? { $_ -is [System.IO.FileInfo] } | sort { $_.Name })
    
if (($files -eq $null-or ($files.Count -eq 0))
    {
        
return
    }
    
if ($filename.Length -eq 0)
    {
        
if ($files -is [System.IO.FileInfo])
        {
            [regex] 
$regex = $files.Extension + "$"
            
$filename = $files.FullName -replace $regex,""
        }
        
else
        {
            
$filename = $files[0].Directory.FullName + "\" + $files[0].Directory.Name
        }
    }
    
if (!($filename -match "[.]sfv$"))
    {
        
$filename += ".sfv"
    }
    
$temp = "${env:Temp}\makesfv.tmp"
    echo 
"; 由 PowerShell.MakeSFV 生成" > $temp
    [string] 
$now = get-date
    echo (
"; 使用 CRC Verification Utility v3.05 于 " + $now>> $temp
    echo 
";" >> $temp
    
$files | % {
        
$r = CRC "$_"
        [regex] 
$regex = "bytes[)] is 0x(.{8,8})"
        
$m = $regex.matches($r)
        
if (($m.Count -gt 0-and $m[0].Success)
        {
            echo (
$_.Name + " " + $m[0].Groups[1].Value) >> $temp
        }
    }
    type 
"$temp" | out-file $filename -encoding default #转为ansi格式
    type "$filename"
    del 
"$temp"
}

if ((dir alias: | ? { $_.Name -eq "csfv"  }) -eq $null)
{
new
-alias csfv Check-SFV -scope global
}
if ((dir alias: | ? { $_.Name -eq "msfv"  }) -eq $null)
{
new
-alias msfv Make-SFV -scope global
}

这段脚本将增加两个全局函数Check-SFV (csfv) 和 Make-SFV (msfv),用途是生成SFV与校验SFV

注意:
1. CRC.EXE在搜索路径里的任意目录内


Usage Example:

msfv C:\book\*.rar
msfv C:\book\*.rar D:\book.sfv
csfv test.sfv
csfv d:\cd\cd.sfv

crc.exe下载:
http://www.cnblogs.com/Files/Icebird/crc.rar

posted on 2008-02-14 18:56  Icebird  阅读(...)  评论(...编辑  收藏