Powershell renomeia vários arquivos com prefixo LastWriteTime

Powershell renomeia vários arquivos com prefixo LastWriteTime

Estou tentando montar um script Powershell que irá:

-Pesquisar recursivamente a partir de um diretório raiz
-Excluir arquivos com o prefixo de nome de arquivo "yyyyMMdd" existente
-Renomear os arquivos não excluídos acima com o prefixo de nome de arquivo ""yyyyMMdd "com base em seu LastWriteTime específico

Nota: idealmente, este script deve incluir todas as extensões de tipo de arquivo

Eu mesmo tentei, mas parece que está acima da minha cabeça, pois minhas tentativas não estão indo bem.

Desde já, obrigado.

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"

Espero mudar a linha:

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

Para ser LastWriteTime em vez de get-date, mas não tenho ideia de como fazer isso acontecer.

Este código (de outra pergunta do superusuário):

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

... renomeia com sucesso um único arquivo, mas não consigo integrar isso ao script maior.


Com relação à execução recursiva do procedimento acima, tentei isso (também dehttp://ss64.com/ps/syntax-stampme.html):

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

Que consegue aplicar o script PS aos arquivos no diretório raiz, mas não consegue aplicar a nenhum arquivo na árvore de subpastas que se propaga a partir do diretório raiz.

Responder1

Este script deve fazer exatamente o que você deseja

  • Pesquise recursivamente em um diretório raiz
  • Excluir arquivos com prefixo de nome de arquivo "yyyyMMdd" existente
  • Renomeie os arquivos não excluídos acima com o prefixo de nome de arquivo ""yyyyMMdd "com base em seu LastWriteTime específico

Aviso: você deve testar este script primeiro porque renomear pode ser perigoso. Remova o #na frente Rename-Itemdepois de verificar que apenas os arquivos intencionais serão renomeados.

Versão longa

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

Versão curta

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

Respostas stackoverflow usadas

Responder2

Eu estava tentando fazer algo semelhante - por exemplo, renomear arquivos com base no lastwritetime. Aqui está o PowerShell que faz isso:

  • Renomeia qualquer/todos os arquivos no diretório atual
  • Preserva extensões de arquivo
  • Nomes no formato aaaa-MM-dd HH-mm-ss (24 horas)

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

informação relacionada