파일 확장자가 일치하지 않는 파일을 바꾸는 방법은 무엇입니까?

파일 확장자가 일치하지 않는 파일을 바꾸는 방법은 무엇입니까?

이 기사에서 논의한 것과 거의 동일한 문제가 있습니다.

한 디렉터리에서 100개의 새 파일을 복사하고 각 파일을 현재 위치의 이전 파일로 바꿉니다.

한 디렉토리에 1000개의 비디오 파일이 있습니다. 이는 많은 하위 디렉토리에 있는 오래된 비디오를 대체해야 하는 새로운 비디오입니다. 기본 이름은 일치하지만 확장자는 일치하지 않습니다. '이전' 폴더에는 여러 하위 디렉토리에 '.MPG' 파일이 있고 '새' 폴더에는 한 디렉토리에 '.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.

이는 basename이 일치하더라도 파일 확장자가 일치하지 않기 때문에 생성됩니다. 따라서 내 질문은: 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)
    }
}

복사본을 변경하여 오래된 파일을 이동하고 삭제하는 것은 쉽지만 코드에서 neitehr을 보았습니다.

답변2

윈도우 10 64비트. 파워셸 5.1

에 대해 $_.basenameLook through Every를 기준으로 파일을 이동합니다 . true이고 같음 인 경우 항목을 로 이동하고 항목을 제거 하고 가 없을 때까지 반복합니다 ."C:\oldfolder".mpg$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." }
# 

관련 정보