Сравните файлы без расширения и удалите файлы из папки в Powershell - PullRequest
0 голосов
/ 11 февраля 2020

Я сравниваю файлы внутри папки. В этой папке некоторые файлы существуют в двух форматах (filename1.jpg, filename1.bmp, ...), а некоторые файлы существуют только в одном формате. Я пытаюсь найти все файлы, которые существуют только в формате .bmp, и удалить их.

Код, который я получил до сих пор:

$jpg = Get-ChildItem "C:\..\" -File -Filter *.jpg | ForEach-Object -Process {[System.IO.Path]::GetFileNameWithoutExtension($_)}
$bmp = Get-Childitem "C:\..\" -File -Filter *.bmp | ForEach-Object -Process {[System.IO.Path]::GetFileNameWithoutExtension($_)}

Compare-Object $jpg $bmp | where {$_.SideIndicator -eq  "=>"} 

В этом списке перечислены файлы, которые я ищу но у меня проблемы с их удалением. Я пробовал некоторые вещи вроде:

Compare-Object $jpg $bmp | where {$_.SideIndicator -eq  "=>"} | ForEach-Object {
    Remove-Item  "C:\..\($_.FullName)"
    }

, но безуспешно. У кого-нибудь есть подсказка, как мне это решить?

1 Ответ

0 голосов
/ 11 февраля 2020

В вашем foreach ваша переменная не является файлом, это результат сравнения.

Попробуйте это:

$a = Get-ChildItem "D:\a" -File -Filter *.jpg
$b = Get-Childitem "D:\b" -File -Filter *.bmp
Compare-Object $a.BaseName $b.BaseName | where {$_.SideIndicator -eq  "=>"}  | foreach {
    $name = $_.InputObject
    $File = $b.Where({$_.BaseName -eq $name})

    if ($File.Count -gt 1) {
        throw "Conflict, more than one file has the name $name"
    } else {
        Remove-Item -Path $File.FullName
    }
}
...