我需要根据它们的LastWriteTime属性比较两个不同文件夹(及其子文件夹)的文件(具有相同的名称),因此我可以找出是否有修改(如果是,那么哪个文件在哪个文件夹是最新的)。
总之:我想知道的是,第二个文件夹中是否有最近修改过的文件副本。
我正在尝试运行Powershell 2.0脚本来执行此操作,但似乎我不知道我在做什么:
$orig = Get-ChildItem -Recurse -path L:\original-files\
$backup = Get-ChildItem -Recurse -path I:\backup-files\
Compare-Object $orig $backup -Property LastWriteTime
哪个输出:
...
Report -- XXXXXXXX, Meeting with suppl... 23/02/2015 17:45:38 =>
Report -- XXXXXXXX, Meeting with suppl... 17/11/2015 20:29:04 =>
Report -- XXXXXXXX, Meeting with suppl... 06/08/2015 22:39:06 =>
Report -- XXXXXXXX, Meeting with suppl... 07/05/2015 03:43:24 =>
Report -- XXXXXXXX, Meeting with suppl... 26/06/2015 15:22:36 =>
Report -- XXXXXXXX, Meeting with suppl... 26/06/2015 17:03:48 =>
Report -- XXXXXXXX, Meeting with suppl... 13/09/2015 15:41:38 =>
Report -- XXXXXXXX, Meeting with suppl... 21/06/2015 23:28:06 =>
Report -- XXXXXXXX, Meeting with suppl... 22/02/2015 01:23:58 =>
Report -- XXXXXXXX, Meeting with suppl... 11/12/2015 00:50:52 =>
Report -- XXXXXXXX, Meeting with suppl... 30/10/2015 05:27:48 <=
Report -- XXXXXXXX, Meeting with suppl... 31/05/2015 17:46:08 <=
...
所以,这个脚本有两个问题:
我仍然不知道哪个文件是最后修改过的文件,因为我大部分时间都得到相同的文件名(不是路径名),但是反转的SideIndicator符号出现在列表中2次(很少1或3次)(我认为这是因为我可能在不同的子文件夹中有相同文件的副本)。例如:
example.docx 25/12/2015 15:15:05 =>
example.docx 23/12/2015 12:36:03 <=
这两个名称相同的文件在哪里?什么应该“=&gt;”并且“&lt; =”符号在这种情况下意味着,我在列表中重复使用相同的文件名,并带有倒置符号?
我只是浪费了一天的努力。请帮忙!我在Win 7 64位上。
PS:我发现附加| Format-List
(即Compare-Object $orig $backup -Property LastWriteTime | Format-List
)正确显示文件的全名,但不显示其路径。因此,知道'Example.docx'在列表中出现2次并带有'=&gt;'是没用的使用'&lt; ='符号进行1次签名。
PS2:我尝试过改变
$orig = Get-ChildItem -Recurse -path L:\original-files\
$backup = Get-ChildItem -Recurse -path I:\backup-files\
到
$orig = Get-ChildItem -Recurse -path L:\original-files\ | Format-List -Property Name, Fullname, LastWriteTime
$backup = Get-ChildItem -Recurse -path I:\backup-files\ | Format-List -Property Name, Fullname, LastWriteTime
但是diff $orig $backup - property lastwritetime | format-list
输出:
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
lastwritetime :
SideIndicator : =>
答案 0 :(得分:2)
如果您要在两个文件夹中查找具有相同名称的文件,并且您想要找到最新的文件,我会尝试这样的事情:
$Source = Get-ChildItem -Path 'C:\Test1' -Recurse -File
$Target = Get-ChildItem -Path 'C:\Test2' -Recurse -File
$Differences = Compare-Object -ReferenceObject $Source -DifferenceObject $Target -Property LastWriteTime -PassThru
$Differences | Group-Object Name | Select -ExpandProperty Group |
Sort-Object LastWriteTime | Select-Object -Last 1
使用开关-File
,我们只询问文件,-Recurse
向我们展示所有子文件夹中的所有文件。
然后,我们会查找具有相同名称的案例文件具有不同LastWriteTime
的差异,并将其保存在变量$Differences
中。
然后,我们通过将具有相同名称的所有文件与Group-Object
一起分组来分析差异。完成后,我们会查看一个包含多个具有相同名称的文件的对象,并在LastWriteTime
上对其进行排序,我们只选择Select-Object -Last 1
的最新文件。
希望这有助于您找到自己的方式。永远记住,PowerShell中的帮助并不遥远:
Get-Help Compare-Object
或Get-Help Compare-Object -Examples
为您提供了很长的路要走。
答案 1 :(得分:0)
所以,在被PS殴打之后,我写了这个效率低下的#javascript-esque&#34; Powershell 2.0的脚本。无需更改首选项等,只需启动控制台并粘贴整个代码块:
$sourcePath = "C:\test1"
$targetPath = "C:\test2"
$source = Get-ChildItem -LiteralPath $sourcePath -Recurse | where { ! $_.PSIsContainer }
$target = Get-ChildItem -LiteralPath $targetPath -Recurse | where { ! $_.PSIsContainer }
$sourceGroup = $source | group-object -property name
$targetGroup = $target | group-object -property name
$includedOrNot = Compare-Object -ReferenceObject $sourceGroup -DifferenceObject $targetGroup -Property Name -Passthru
$excludedSource = $includedOrNot | where-object { $_.SideIndicator -eq "=>"}
$excludedTarget = $includedOrNot | where-object { $_.SideIndicator -eq "<="}
$differentTime = Compare-Object -ReferenceObject $Source -DifferenceObject $Target -Property LastWriteTime -PassThru
$filesInTarget = @()
$buffer = @()
foreach ($i in $differentTime) {$buffer += , @($i.name, $i.lastwritetime, $i.fullname)}
for ($i = 0; $i -ne $buffer.length; $i++) {
$bufname = $buffer[$i][0] ; $buftime = $buffer[$i][1]; foreach ($ii in $buffer) {
if ($ii[0] -eq $bufname -and $ii[1] -gt $buftime -and $ii[2].startswith($targetPath)) {
$filesInTarget += , @($ii)
}
}
}
$newerFiles = @()
foreach ($iii in $filesInTarget) {$newerFiles+= $iii[-1]}
echo "`n`n***START`n`n`nAbsent files in SOURCE folder:`n`n"; $excludedSource |format-list;`
"`n`nAbsent files in TARGET folder:`n"; $excludedTarget |format-list;`
"`n`n`n`n`nNEWER FILES IN TARGET FOLDER:`n`n"; $filesInTarget | format-list;`
"`n`n`n`n`n`n`n`n`n`nSUMMARY:`n`nNumber of files absent in SOURCE: " + $excludedSource.count;`
$excludedSource | Format-Table Count, Name -Autosize;`
"`nNumber of files absent in TARGET: " + $excludedTarget.count;`
$excludedTarget | Format-Table Count, Name -Autosize;`
"`nNewer files in target folder:", $newerFiles, "`n`n***END`n"
#END OF FILE
它显示目标文件夹和子文件夹中是否存在最近更改的同名文件(与源文件夹和子文件夹相比)。它还会告诉一个文件夹中是否有文件,但是另一个文件夹中没有同名文件。
非常感谢DarkLite1让我走上了正确的道路!