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-Item
depois 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
[DateTime]::TryParseExact
para testar se os primeiros 8 caracteres podem ser uma data válida$_.lastwritetime.tostring("yyyyMMdd ")
para formatar oúltima escritacarimbo
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)) }