programing

Powershell을 사용하여 파일 이름을 재귀적으로 변경하는 중

megabox 2023. 10. 21. 10:18
반응형

Powershell을 사용하여 파일 이름을 재귀적으로 변경하는 중

나는 현재 내가 있는 폴더에 파일 이름을 일괄 변경할 줄을 가지고 있습니다.

dir | foreach { move-item -literal $_ $_.name.replace(".mkv.mp4",".mp4") }

이 코드는 현재 내가 어떤 디렉토리에 있든 완벽하게 작동하지만, 내가 원하는 것은 11개의 하위 폴더가 포함된 상위 폴더에서 스크립트를 실행하는 것입니다.각 폴더를 개별적으로 탐색하여 작업을 수행할 수 있지만, 스크립트를 한 번 실행하여 완료하고 싶습니다.

나는 다음을 시도했습니다.

get-childitem -recurse | foreach { move-item -literal $_ $_.name.replace(".mkv.mp4",".mp4") }

누가 여기 있는 올바른 방향을 가르쳐 줄 수 있습니까?저는 파워셸에 대해 잘 알지 못하지만, 이 경우에는 제 요구에 맞았습니다.

가까이 있었군요.

Get-ChildItem -File -Recurse | % { Rename-Item -Path $_.PSPath -NewName $_.Name.replace(".mkv.mp4",".mp4")}

정확히 이 시나리오를 위해 설계된 잘 알려지지 않은 기능이 있습니다.간단히 말하면 다음과 같은 작업을 수행할 수 있습니다.

Get-ChildItem -Recurse -Include *.ps1 | Rename-Item -NewName { $_.Name.replace(".ps1",".ps1.bak") }

그러면 매개 변수 NewName에 대한 스크립트 블록을 전달하여 ForEach-Object를 사용하지 않습니다.PowerShell은 파이핑되는 각 개체에 대한 스크립트 블록을 평가할 수 있을 정도로 똑똑하며, ForEach-Object에서와 마찬가지로 $_을 설정합니다.

다음과 같은 오류가 여전히 발생하는 경우 주의하십시오.Cannot rename because item at '...' does not exist., 일부 초장대 경로 및/또는 대괄호 같은 'specially interpre' 문자를 사용하는 경로를 사용할 수 있습니다.[ ]).

이러한 시나리오의 경우 다음을 사용합니다.-LiteralPath/-PSPath특수 접두어와 함께\\?\(UNC 경로의 경우 접두사를 사용합니다.\\?\UNC\최대 32k 문자의 경로에 대해 설명합니다.또한 조기 필터링을 제안합니다.Get-ChildItem성능 향상을 위해 제공(적음)Rename-Item전화가 더 좋습니다.


$path = 'C:\Users\Richard\Downloads\[Long Path] THE PATH TO HAPPINESS (NOT CLICKBAIT)\...etc., etc.'
# -s is an alias for -Recurse
# -File for files only
# gci, dir, and ls are all aliases for Get-ChildItem
#   Note that among the 3, only `gci` is ReadOnly.
gci -s -PSPath $path -File -Filter "*.mkv.mp4" |
    # ren, rni are both aliases for Rename-Item
    #   Note that among the 2, only `rni` is ReadOnly.
    # -wi is for -WhatIf (a dry run basically). Remove this to actually do stuff.
    # I used -replace for regex (for excluding those super rare cases)
  rni -wi -PSPath { "\\?\$($_.FullName)" } -NewName { $_.Name -replace '\.mkv(?=\.mp4$)','' }

언급URL : https://stackoverflow.com/questions/21611551/recursively-renaming-files-with-powershell

반응형