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"

是 LastWriteTime 而不是 get-date,但我不知道如何實現這一點。

此程式碼(來自另一個超級用戶問題):

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)) }

相關內容