Как проверить дубликаты нескольких файлов с помощью powershell? - PullRequest
2 голосов
/ 31 октября 2019

Я хочу проверить дубликат файла. Если состояние файла такое, это значит дубликат. То же имя, но другое расширение.

AAA18WWQ6BT602.PRO
AAA18WWQ6BT602.XML

Я могу выяснить этот случай с помощью моего сценария. Но у меня проблема, если у меня есть более 1 .XML-файла, например

AAA18WWQ6BT602.PRO
AAA18WWQ6BT602.XML
AAA18WWQ6BT601.XML
AAA18WWQ6BT604.XML

. В этом случае он не обнаружит дубликаты файлов AAA18WWQ6BT602.PRO и AAA18WWQ6BT602.XML. Любой может помочь мне, пожалуйста. Спасибо

$duplicate = @()
    @(Get-ChildItem "$Flag_Path\*.xml") | ForEach-Object { $duplicate += $_.basename }

    if(Test-Path -Path "$Flag_Path\*$duplicate*" -Exclude *.xml)
    {
        Get-ChildItem -Path "$Flag_Path\*$duplicate*" -Include *.xml | Out-File $Flag_Path\Flag_Duplicate
        Write-Host "Flag duplicated, continue for Error_Monitoring" 
        pause
        Error_Monitoring
    }
    else{
    Write-Host "Flag does not duplicate, continue the process"
}

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Параметр -Include работает только в том случае, если путь к Get-ChildItem заканчивается на \* ИЛИ, если используется переключатель -Recurse.

Следующие действия должны выполнять то, что вы хотите:

$flagFolder = 'D:\*'
$dupeReport = 'D:\Flag_Duplicate.txt'
$duplicates = Get-ChildItem -Path $flagFolder -File -Include '*.xml', '*.pro' | 
              Group-Object -Property BaseName | Where-Object { $_.Count -gt 1 }

if ($duplicates) {
    # output the duplicate XML to Flag_Duplicate.txt
    $duplicates.Group | Where-Object {$_.Extension -eq '.xml' } | ForEach-Object {
        $_.FullName | Out-File -FilePath $dupeReport -Append
    }
    # do the rest of your code
    Write-Host "Flag duplicated, continue for Error_Monitoring" 
    Error_Monitoring
}
else {
    Write-Host "Flag does not duplicate, continue the process"
}
1 голос
/ 31 октября 2019

Ваш скрипт не повторяется правильно. Вы должны иметь итерацию для проверки. Логика Test-Path выглядит смешанной для меня. Я пытался сохранить как можно больше вашего кода.

Этот сценарий проверяет наличие любого имени файла xml basename по любому дубликату суффикса (не только pro):

$Flag_Path = "C:\dir_to_be_checked"
$xmlFilesArray = @()
$allFilesExceptXml = @() # all files excluding xml files

# Get all the xml files
Get-ChildItem -Path $Flag_Path -Include "*.xml" | ForEach-Object { $xmlFilesArray += $_.basename }
# Get all files from the directory the xml files
Get-ChildItem -Path $Flag_Path -Exclude "*.xml" | ForEach-Object { $allFilesExceptXml += $_.basename }

# Iterate over list of files names without suffix
ForEach ($xmlFile in $xmlFilesArray) { 
    ForEach ($fileToCheck in $allFilesExceptXml) {
        If ($xmlFile -eq $fileToCheck) {
            # logging the duplicate file (specifying utf8 or the output would be UTF-16)
            Write-Output "$Flag_Path\$xmlFile.xml" | Out-File -Append -Encoding utf8 $Flag_Path\Flag_Duplicate
            Write-Host "Flag duplicated, continue with duplicate search" 
            # pause
            Write-Host "Press any key to continue ..."
            $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
            Error_Monitoring
        } Else {
            Write-Host "Flag is not duplicated.  Continue with the search."
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...