Powershell은 LastWriteTime 접두사를 사용하여 여러 파일 이름을 바꿉니다.

Powershell은 LastWriteTime 접두사를 사용하여 여러 파일 이름을 바꿉니다.

다음과 같은 Powershell 스크립트를 작성하려고 합니다.

- 루트 디렉터리에서 재귀적으로 검색
- 기존 "yyyyMMdd " 파일 이름 접두사가 있는 파일 제외
- 위에서 제외되지 않은 파일의 이름을 특정 LastWriteTime을 기준으로 ""yyyyMMdd " 파일 이름 접두사로 바꿉니다.

참고: 이상적으로는 이 스크립트에 모든 파일 형식 확장자가 포함되어야 합니다.

스스로 시도해 보았지만, 시도가 잘 되지 않아서 머리 위로 떠오르는 것 같습니다.

미리 감사드립니다.

http://ss64.com/ps/syntax-stampme.html

#StampMe.ps1
param( [string] $fileName)

# Check the file exists
if (-not(Test-Path $fileName)) {break}

# Display the original name
"Original filename: $fileName"

$fileObj = get-item $fileName

# Get the date
$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

$extOnly = $fileObj.extension

if ($extOnly.length -eq 0) {
   $nameOnly = $fileObj.Name
   rename-item "$fileObj" "$nameOnly-$DateStamp"
   }
else {
   $nameOnly = $fileObj.Name.Replace( $fileObj.Extension,'')
   rename-item "$fileName" "$nameOnly-$DateStamp$extOnly"
   }

# Display the new name
"New filename: $nameOnly-$DateStamp$extOnly"

나는 줄을 바꾸기를 바라고 있습니다 :

$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

get-date 대신 LastWriteTime이 되려면 어떻게 해야 할지 모르겠습니다.

이 코드(다른 슈퍼유저 질문에서 발췌):

Get-ChildItem "Test.pdf" | Rename-Item -newname {$_.LastWriteTime.toString("yyyyMMdd") + " Test.pdf"}

...단일 파일의 이름을 성공적으로 바꾸었지만 이를 더 큰 스크립트에 통합할 수 없는 것 같습니다.


위의 내용을 재귀적으로 실행하는 것과 관련하여 나는 이것을 시도했습니다(또한http://ss64.com/ps/syntax-stampme.html):

foreach ($file in get-ChildItem *.* -recurse) { ./StampMe.ps1 $file.name }

PS 스크립트를 루트 디렉터리의 파일에 적용하는 데 성공했지만 루트 디렉터리에서 전파되는 하위 폴더 트리의 파일에는 적용하지 못했습니다.

답변1

이 스크립트는 정확히 원하는 작업을 수행해야 합니다.

  • 루트 디렉터리에서 재귀적으로 검색
  • 기존 "yyyyMMdd" 파일 이름 접두사가 있는 파일 제외
  • 특정 LastWriteTime을 기반으로 ""yyyyMMdd " 파일 이름 접두사를 사용하여 위에서 제외되지 않은 파일의 이름을 바꿉니다.

경고: 이름을 바꾸면 위험할 수 있으므로 이 스크립트를 먼저 테스트해야 합니다. 의도적인 파일만 이름이 변경된다는 것을 확인한 후 #앞에 있는 를 제거하십시오 .Rename-Item

긴 버전

$folder = "C:\somefolder"
$files = get-childitem -path $folder -recurse | where { -not $_.PSIsContainer }
[datetime]$dirDate = New-Object DateTime

foreach ($file In $files) {

    $strDate = $file.Name.substring(0,8)

    if (-Not [DateTime]::TryParseExact($strDate, "yyyyMMdd", 
        [System.Globalization.CultureInfo]::InvariantCulture, 
        [System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {

        $newName = $file.lastwritetime.tostring("yyyyMMdd ") + $file.name
        echo $newName
        #Rename-Item -path $file.Fullname -newname $newName
    }   
}

짧은 버전

[datetime]$dirDate = New-Object DateTime

dir "C:\somefolder" -r | ? { ! $_.PSIsContainer } | % {          

    if ( ! [DateTime]::TryParseExact($_.Name.substring(0,8), "yyyyMMdd", 
        [System.Globalization.CultureInfo]::InvariantCulture, 
        [System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {

        $newName = $_.lastwritetime.tostring("yyyyMMdd ") + $_.name
        echo $newName
        #Ren $_.Fullname $newName
    }
}

사용된 stackoverflow 답변

답변2

비슷한 작업을 수행하려고 했습니다. 예를 들어 마지막 쓰기 시간을 기준으로 파일 이름을 바꾸는 것이었습니다. 이를 수행하는 Powershell은 다음과 같습니다.

  • 현재 디렉터리의 모든 파일 이름을 바꿉니다.
  • 파일 확장자를 유지합니다
  • yyyy-MM-dd HH-mm-ss 형식의 이름(24시간)

ls | % { Rename-Item $_ -NewName ($_.LastWriteTime.ToString("yyyy-MM-dd HH-mm-ss") + ($_.extension)) }

관련 정보