У меня почти та же проблема, что обсуждалась в этой статье:
У меня есть 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." }
#