Как заменить файлы, расширения которых не совпадают?

Как заменить файлы, расширения которых не совпадают?

У меня почти та же проблема, что обсуждалась в этой статье:

скопируйте 100 новых файлов из одного каталога и замените каждый файл старыми файлами в их текущем местоположении

У меня есть 1000 видеофайлов в одном каталоге. Это новые видео, которые должны заменить старые видео, расположенные во многих подкаталогах. Их базовые имена совпадают, но расширения — нет. В папке «old» у меня есть файлы «.MPG», расположенные во многих подкаталогах, а в папке «new» у меня есть файлы «.mp4» в одном каталоге. В обоих у меня есть видеофайлы с одинаковым базовым именем. Как мне это сделать?

Вот что я написал в PowerShell (в oldfolder 300 различных подкаталогов):

$newFiles = "C:\newfolder"
$oldFiles = "C:\oldfolder"

Get-ChildItem $newFiles | ForEach-Object {

    $currentFile = $_

    $oldFileLocation = Get-ChildItem -Recurse $oldFiles | Where-Object { $_ -Match "$currentFile"} | Select-Object -ExpandProperty DirectoryName

    if($oldFileLocation) {   # if this variable is not null, we've found original file location
        Write-Host "found file [$currentFile] in location: [$oldFileLocation]. overwriting the original."
        Copy-Item -Path $newFiles\$currentFile -Destination $oldFileLocation -Force
    }
    else {
        Write-Warning "could not find file [$currentFile] in location [$oldFiles]."
    }

}

Затем я запустил код и получил следующее сообщение об ошибке:

WARNING: could not find file [M2U00386.mp4] in location [C:\oldfolder].
WARNING: could not find file [M2U00387.mp4] in location [C:\oldfolder].
WARNING: could not find file [M2U00388.mp4] in location [C:\oldfolder].
WARNING: could not find file [M2U00389.mp4] in location [C:\oldfolder].
.
.
. # and so on because it would find them if the new files were M2U00386.MPG not .mp4.

Это происходит из-за того, что расширение файла не совпадает, хотя базовое имя совпадает. Поэтому у меня вопрос: что мне нужно изменить в первом коде, чтобы PowerShell не обращал внимания на расширение файла?

Заранее спасибо.

решение1

Это должно сработать.

$newFiles = 'C:\newfolder'
$oldFiles =  'C:\oldfolder'

$oldHash = @{}
Get-ChildItem $oldFIles -File -Recurse | ForEach{
    $oldHash.Add($_.BaseName, $_.DirectoryName)
}

Get-ChildItem $newFiles | ForEach{
    If ($_.BaseName -in $oldHash.Keys) {
        Copy-Item $_.FullName  $oldHash[$_.BaseName]
    } Else {
        echo ('No match found for "{0}".' -f $_.Name)
    }
}

Достаточно просто изменить копирование на перемещение и добавить удаление старых файлов, но в вашем коде я ничего подобного не увидел.

решение2

Windows 10 64-бит. PowerShell 5.1

Переместить файлы на основе $_.basenameПросмотреть все "C:\oldfolder"для .mpg. Если true и $mp4baseравно $mpgbase, переместить-элемент $mp4в $mpgdir, удалить-элемент $mpgи цикл до тех пор, пока не останется $mpg.Для тестирования очистите рабочий стол. На рабочем столе не должно быть каталогов с именем mp4или .mpg

pushd $env:USERPROFILE\Desktop;ni -itemtype directory "mp4", "mpg\mpg2">$null;foreach($i in 1..20){ni -itemtype file "mp4\$i.mp4">$null };foreach($i in 1..10){ni -itemtype file "mpg\$i.mpg">$null };foreach($i in 11..20){ni -itemtype file "mpg\mpg2\$i.mpg">$null };popd;
$Files = @(Get-ChildItem .\mpg\*.mpg -recurse)
if (!($Files.length -eq 0)) {
Get-ChildItem mp4 | ForEach-Object { 
    $mp4= $_.fullname
    $mp4base= $_.basename
Get-ChildItem mpg -recurse | ForEach-Object {
    $mpg = $_.fullname
    $mpgbase= $_.basename
    $mpgdir= $_.directoryname
    if ($mp4base -eq $mpgbase) {
    move-item $mp4 $mpgdir
    remove-item $mpg
    }
}} 
explorer .\mpg;cls 
Read-Host "    
Press enter key to delete all test files"
ri (".\mpg", ".\mp4") -recurse -force 
#
popd 
#    
} else {write-host "   No .mpg to process." }
# 

Связанный контент