A THINKING FRUIT
概要
指定したフォルダ内のファイルハッシュを出力する。
使用例
PS> Folder-Hash D:\bin\ps1
出力結果:
D:\bin\ps1 capture-window-v1.ps1 06F218821CE5C34F38C376B8357AB31A folder-hash.ps1 D3EE6ADEB1D508A2E2D8960B8AA6F3ED hello.ps1 CF3672B6A37D42282548E845E5C5BCE8
ソース
Folder-Hash.ps1
<# .SYNOPSIS 指定したフォルダ内のファイルハッシュを出力する。 .DESCRIPTION 指定したフォルダ内のファイルハッシュを出力する。 二つのフォルダでハッシュを出力し、比較することで差異を確認することができる。 .PARAMETER directory フォルダパス。 .EXAMPLE Folder-Hash D:\tmp #>
Param( [System.IO.DirectoryInfo][Parameter(Mandatory=$True, HelpMessage='フォルダパス指定して下さい。')] $directory ) # 除外するフォルダ # フォルダ名を指定する。 $excludeFolder1 = @('debug', 'release') $excludeFolder2 = @('.svn', '.git', '.vs', '.vscode') # 除外するフォルダを一つの変数にまとめる。 $excludeFolder = [System.Collections.Generic.List[String]]::new() $excludeFolder1 | %{ $excludeFolder.Add($_) } ; $excludeFolder1 = $Null $excludeFolder2 | %{ $excludeFolder.Add($_) } ; $excludeFolder2 = $Null # 除外フォルダ判定 function IsExcludeFolder( [System.IO.DirectoryInfo] $directory ) { $name1 = $directory.Name.ToLower() foreach( $excludeName in $excludeFolder ) { $bHittest = $name1 -eq $excludeName if( $bHittest ) { return $True } } return $False } # ファイルの存在確認 # シンボリックリンクの場合、シンボリックリンク先の存在確認も行う。 function IsExistLinkTarget( $i ) { $bHittest = $i.Attributes -band [System.IO.FileAttributes]::ReparsePoint if( $bHittest ) { return Test-Path $i.LinkTarget } return $True } # メイン処理 function MainProcess( [System.IO.DirectoryInfo] $SrcDir, [Int32] $nIndexOf ) { ###################################################################### # ファイル列挙 $sortedFiles = [System.Collections.Generic.SortedList[String, System.IO.FileInfo]]::new() $files = $SrcDir.EnumerateFiles() foreach( $file in $files ) { $sortedFiles.Add( $file.Name.ToLower(), $file ) } $files = $Null foreach( $file in $sortedFiles.GetEnumerator() ) { $strHash = '-' $r = IsExistLinkTarget $file.Value if( $r ) { $strHash = (Get-FileHash $file.Value.FullName MD5).Hash } "`t{0}`t{1}" -f $file.Key, $strHash } $sortedFiles = $Null ###################################################################### # フォルダ列挙 $sortedDirectories = [System.Collections.Generic.SortedList[String, System.IO.DirectoryInfo]]::new() $directories = $SrcDir.EnumerateDirectories() foreach( $dir in $directories ) { if( IsExcludeFolder($dir) ) { continue } $sortedDirectories.Add( $dir.Name.ToLower(), $dir ) } $directories = $Null foreach( $dir in $sortedDirectories.GetEnumerator() ) { $r = IsExistLinkTarget $dir.Value if( $r ) { $dir.Value.FullName.Substring( $nIndexOf ) MainProcess $dir.Value $nIndexOf } else { '{0} ... not found.' -f $dir.Value.FullName } } $sortedDirectories = $Null ###################################################################### } try { MainProcess $directory $directory.FullName.Length } catch { throw }