【发布时间】:2020-01-18 18:41:44
【问题描述】:
我有一个脚本,它会比较两个非常相似的目录,看看哪个目录有更新、更新的文件。这两个路径具有相同的文件,但路径名称的位置略有不同。这两个文件夹的文件数量大致相同,可能比另一个少两三个。
$path1 = "E:\docs\training\files"
$path2 = "D:\docs\training - Copy\files"
$outdatedFiles = @()
foreach($file in $Folder1)
{
foreach($file2 in $Folder2)
{
if($file2.BaseName -match $file.BaseName)
{
if($file.LastWriteTime -gt $file2.LastWriteTime)
{
$Result = "" | Select OutDatedFile,LastWriteTime
$Result.OutDatedFile = $file2.FullName
$Result.LastWriteTime = $file2.LastWriteTime
$outdatedFiles += $Result
}
}
}
}
在$outdatedFiles 数组中,我得到的文件不比其他目录中的对应文件更新。我认为这可能是由于我在if 语句中的比较,我尝试了-match、-contains 和-ccontains,看看这些是否能满足我的需求。都没有奏效。由于每个文件夹中的文件数量略有不同,foreach 可能不起作用。有什么建议吗?
编辑
我尝试构建一个哈希,但没有找到所有更新的文件:
$outdatedFiles = @()
foreach($file in $Folder1)
{
foreach($file2 in $Folder2)
{
if($file2.Name -like $file.Name)
{
#compare hash here
$Hash2 = Get-FileHash $file2.FullName -Algorithm SHA256
$Hash1 = Get-FileHash $file.FullName -Algorithm SHA256
if($Hash2.Hash -ne $Hash1.Hash)
{
$Result = "" | Select OutDatedFile,LastWriteTime
$Result.OutDatedFile = $file2.FullName
$Result.LastWriteTime = $file2.LastWriteTime
$outdatedFiles += $Result
}
}
}
}
编辑
这是我的解决方案
$Differences1 = @()
foreach($file in $Folder1)
{
foreach($file2 in $Folder2)
{
<#Trim path then compare#>
#File1
$file1part1 = ($file.FullName).Split("\")[-2]
$file1part2 = ($file.FullName).Split("\")[-1]
$newPath1 = $file1part1 + "\" + $file1part2
#File2
$file2part1 = ($file2.FullName).Split("\")[-2]
$file2part2 = ($file2.FullName).Split("\")[-1]
$newPath2 = $file2part1 + "\" + $file2part2
if($newPath1 -like $newPath2)
{
$Differences1 += Compare-Object (gci $file2.FullName) -DifferenceObject (gci $file.FullName) -Property LastWriteTime -PassThru | Select Name,FullName,LastWriteTime | Sort-Object -Property Name
}
}
}
if($Differences1 -ne $null)
{
$Differences1 | Out-File $textFile -Append
}
else
{
"No folders have different modified dates" | Out-File $textFile -Append
}
【问题讨论】:
-
遍历每个目录并为每个文件构建一个 hash/crc/SHA256。然后比较哈希值,每边额外/不同的哈希值是感兴趣的文件。见
Get-FileHash -
$outdatedFiles = Compare-Object (gci $path1) -DifferenceObject (gci $path2) -Property LastWriteTime -PassThru | Select * | Out-GridView可能是一个更简单的解决方案。 -
如果存在具有不同扩展名的类似文件,例如 program.exe 和 program.config,请使用
.Name而不是.BaseName。 -
Here's another SO question 这并不完全是重复的,但如果您沿着
Compare-Object路线走下去可能会有所帮助。 -
@RichMoss 我发现了我原来的问题。我有多个文件具有相似的路径以及完全相同的文件名和扩展名。该脚本正在比较这些而不是其他目录中的对应项。我该如何避免这种情况?
标签: powershell directory comparison operators