<#
.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
}