Powershell Renomeie vários arquivos com prefixo LastWriteTime

3

Estou tentando montar um script do Powershell que:

-Pesquisar recursivamente a partir de 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 do nome de arquivo "" aaaaMMdd "com base em seu LastWriteTime específico

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

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

Obrigado antecipadamente.

link

#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 de 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 no script maior.

No que diz respeito à execução do acima recursivamente, eu tentei isso (também de link ):

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

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

    
por Ryan 22.12.2013 / 08:39

1 resposta

3

Este script deve fazer exatamente o que você quer

  • Search recursively from a root directory
  • Exclude files with existing "yyyyMMdd " file name prefix
  • Rename the files not excluded above with ""yyyyMMdd " file name prefix based on their specific LastWriteTime

Aviso: você deve testar este script primeiro porque a renomeação pode ser perigosa. Remova o # na frente de Rename-Item depois de ter verificado 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 usadas do stackoverflow

por 23.12.2013 / 03:55

Tags