我有一个已混合和匹配的脚本,但无法运行(在底部)。举个例子:我正在使用 powershell 来查找重复的文件 - 文件名。我有一个文件 - WhatzIt.mp3 - 这是我想保留的文件,因为它是该特定编码中最小的文件。我在其他目录中有该文件的较旧/较大版本 - 具有不同的扩展名 - 我想用该文件覆盖它。
示例:
文件夹A - WhatzIt.mp3 5mb
文件夹B - WhatzIt.m4a 10mb
文件夹B - WhatzIt.opus 7mb
文件夹B - WhatzIt.mp3 8mb
期望的结果:
文件夹A - WhatzIt.mp3 5mb
文件夹B - WhatzIt.mp3 5mb
我想要一个递归搜索,在选定的(2个或更多,FolderA + FoldB)目录及其子目录中,将识别(在本例中)有4个具有相同文件名的文件(“WhatzIt”,可能区分大小写,忽略扩展名)差异) 然后,我可以自动识别较小的文件(WhatzIt.mp3)并将其复制到发现具有相同名称的文件(WhatzIt.,4a,WhatzIt.opus)的目录中,从而可能覆盖文件(WhatzIt.mp3)。文件夹 B 中的 mp3)。并删除其他较大的同名文件(WhatzIt.m4a、WhatzIt.opus)。
这是我已经尝试过的代码 - 当我用谷歌搜索时,我几乎不知道如何或为什么。
$aDir = "C:\FolderA"
$bDir = "C:\FolderB"
$aFiles = Get-ChildItem -Path "$aDir" -Recurse
$bFiles = Get-ChildItem -Path "$bDir" -Recurse
ForEach ($file in $aFiles) {
if(Test-Path $bFiles) | Where-Object {$_.BaseName -eq $aFiles} {
Write-Output "$file exists in $bDir. Copying."
Remove-Item $bDir\$file -recurse | Where-Object {$_.BaseName -eq $aFile}
Copy-Item $aDir\$file $bDir -recurse -include *.opus, *.mp3,*.m4a
} else {
Write-Output "$file does not exist in $bDir."
}
}
脚本输出(或执行)了写入输出部分,但似乎没有处理或考虑代码的其余部分。我认为它设法在目录之间进行比较 - 也许不会 - 但然后什么也不做。
您似乎在告诉我们您总是希望复制FolderA中的文件
到FolderB,因为它比FoldreB 中的文件更小且更新,对吗?
同时删除FolderB中具有相似BaseName但具有不同扩展名的所有文件
(“.opus”、“.mp3”、“.m4a”中的任何一个)
为此,我建议使用 Get-ChildItem 仅获取具有任何以下内容的 files 首先提到的三个扩展名,然后循环遍历文件夹 A 中的列表以查找并删除文件夹 B 中的文件。
# append switch -File so your lists will not also contain directories
$aFiles = Get-ChildItem -Path $aDir -File -Include '*.opus', '*.mp3','*.m4a' -Recurse
$bFiles = Get-ChildItem -Path $bDir -File -Include '*.opus', '*.mp3','*.m4a' -Recurse
# loop over the source files in FolderA
foreach ($file in $aFiles) {
# delete the B files with the same BaseName as the current file from the A folder
$bFiles | Where-Object {$_.BaseName -eq $file.BaseName} | ForEach-Object {
Write-Host "Deleting '$($_.FullName)'..."
$_ | Remove-Item -WhatIf # see below about the WhatIf switch
}
# next, copy the file from the A folder to the B folder
$file | Copy-Item -Destination $bDir
}
我已将
-WhatIf
添加到破坏性的 Remove-Item
命令中,因此现在发生的情况是您只能在控制台中看到哪些文件将被删除。
事实上,没有任何东西被真正删除。如果控制台中的输出符合您的预期,请删除 -WhatIf
开关并再次运行代码