Extrai a data de criação do Word no nome do arquivo

1

Eu tenho alguns documentos do Word com datas de criação variadas ( doc e docx ). Gostaria de renomear os arquivos para incluir essa data de criação. Isso é possível? Esta não é a data última modificação do sistema de arquivos, essa é a data interna de criação do Word que pode ser visualizada em File->Info->Properties dentro do Word

Por exemplo Gostaria de renomear o documento Summary meeting 123.doc para 123 2010-01-01 Summary meeting 123 . A parte 123 é factível com uma regex simples, mas como posso obter a data de criação do arquivo?

Outra solução seria definir a data da última modificação do sistema de arquivos para a data de criação da palavra interna.

    
por dtech 15.02.2014 / 11:36

1 resposta

2

Usando este script do PowerShell: (encontrado aqui: link )

Edit2: editou o script para corresponder ao seu cenário específico.

Param(
    $path = "Q:\Test",  
    [array]$include = @("*.docx","*.docx")
)

$application = New-Object -ComObject word.application
$application.Visible = $false
$binding = "System.Reflection.BindingFlags" -as [type]
[ref]$SaveOption = "microsoft.office.interop.word.WdSaveOptions" -as [type]

## Get documents
    $docs = Get-childitem -path $Path -Recurse -Include $include    #Remove -Recurse if you dont want to include subfolders.

## Iterate documents
foreach($doc in $docs)
{
    try 
    {
        ## Get document properties:
            $document = $application.documents.open($doc.fullname)
            $BuiltinProperties = $document.BuiltInDocumentProperties
            $pn = [System.__ComObject].invokemember("item",$binding::GetProperty,$null,$BuiltinProperties,"Creation Date") 
            $value = [System.__ComObject].invokemember("value",$binding::GetProperty,$null,$pn,$null)

        ## Clean up
            $document.close([ref]$saveOption::wdDoNotSaveChanges) 
            [System.Runtime.InteropServices.Marshal]::ReleaseComObject($BuiltinProperties) | Out-Null
            [System.Runtime.InteropServices.Marshal]::ReleaseComObject($document) | Out-Null
            Remove-Variable -Name document, BuiltinProperties

        ## Rename document:
            if($doc.PSChildName -match "^(.+)(\d{3})(.+)$")  # Matches "(Summary meeting )(123)(.doc)"
            { 
                $date=$value.ToString('yyyy-MM-dd');
                $newName = "$($matches[2]) $($date) $($matches[1])$($matches[2])$($matches[3])";
                write-host $newName;
                Rename-Item $doc $newName
            }   
    }
    catch
    { 
        write-host "Rename failed."
            $_
    } 
}
## Clean up
    $application.quit()
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($application) | Out-Null
    Remove-Variable -Name application
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()

Altere a variável $ caminho para a pasta em que seus documentos estiverem.

Edite a seção #Rename com qualquer lógica extra que você precisar, o regex que eu adicionei corresponde ao exemplo específico fornecido em sua postagem, ajuste-a para que ela corresponda a todos os seus documentos. Qualquer padrão dentro de um (parênteses) pode ser referido usando o array "matches []", iniciando no índice 1.

Eu sugiro que você comente a linha "Renomear-Item" até ter certeza de que o "$ newName" está correto. O extra $ () adicionado ao redor das variáveis na linha "$ newName=" - existe para que as variáveis se expandam.

PS: Certifique-se de ativar a execução de scripts powershell, abra o PS como admin e digite: "Set-ExecutionPolicy RemoteSigned")

    
por 15.02.2014 / 14:03