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

... 1 つのファイルの名前を変更することは成功しましたが、これをより大きなスクリプトに統合することはできないようです。


上記を再帰的に実行することに関しては、私はこれを試しました(これも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

私も同じようなことをやろうとしていました。たとえば、lastwritetime に基づいてファイル名を変更するなどです。これを実行する PowerShell は次のとおりです。

  • 現在のディレクトリ内の任意の/すべてのファイルの名前を変更します
  • ファイル拡張子を保持
  • 名前は yyyy-MM-dd HH-mm-ss 形式 (24 時間) です。

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

関連情報