Extraer la fecha de creación de Word en el nombre de archivo

1

Tengo algunos documentos de Word con fechas de creación variables doc y docx ). Me gustaría cambiar el nombre de los archivos para incluir esta fecha de creación. es posible? Este no es el sistema de archivos. última modificación fecha, esta es la fecha de creación interna de Word visible en File->Info->Properties dentro de la palabra

P.ej. Me gustaría cambiar el nombre del documento Summary meeting 123.doc a 123 2010-01-01 Summary meeting 123. La parte 123 es factible con una expresión regular simple, pero ¿cómo puedo obtener la fecha de creación del archivo?

Otra solución sería establecer la fecha de última modificación del sistema de archivos en la fecha de creación de la palabra interna.

dtech
fuente

Respuestas:

2

Utilizando este script de PowerShell: (encontrado aquí: http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/02/use-powershell-to-find-specific-word-built-in-properties.aspx )

Edit2: Edite el script para que coincida con su escenario 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()

Cambie la variable $ path a la carpeta en la que se encuentren sus documentos.

Edite la sección #Nombre con cualquier lógica adicional que necesite, la expresión regular que he agregado coincide con el ejemplo particular que proporcionó en su publicación, modifíquela para que coincida con todos sus documentos. Se puede hacer referencia a cualquier patrón dentro de (paréntesis) usando la matriz "coincidencias []", comenzando en el índice 1.

Sugeriría comentar la línea "Renombrar-Elemento" hasta que esté seguro de que "$ newName" es correcto. El $ () adicional agregado alrededor de las variables en la línea "$ newName =" - está ahí para que las variables se expandan.

PD: Asegúrese de habilitar la ejecución de los scripts de powershell, abra PS como administrador e ingrese: "Set-ExecutionPolicy RemoteSigned")

Martin
fuente
Gracias, eso parece adecuado. De hecho, puedo usar una expresión regular con esta información, pero ¿sabe cómo puedo usar expresiones regulares en Powershell para cambiar el nombre de los archivos?
dtech
1
Ver respuesta actualizada.
Martin