1

У меня есть несколько документов Word с разными датами создания (как doc и docx). Я хотел бы переименовать файлы, чтобы включить эту дату создания. Это возможно? Это не дата последнего изменения файловой системы, это внутренняя дата создания Word, доступная для просмотра в File->Info->Properties внутри Word.

Например, я хотел бы переименовать документ Summary meeting 123.doc на 123 2010-01-01 Summary meeting 123 . Часть 123 выполнима с простым регулярным выражением, но как я могу получить дату создания файла?

Другим решением было бы установить дату последнего изменения файловой системы на дату создания внутреннего слова.

1 ответ1

2

Используя этот PowerShell-скрипт: (находится здесь: http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/02/use-powershell-to-find-specific-word-built-in-properties. aspx)

Edit2: отредактировал скрипт в соответствии с вашим конкретным сценарием.

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()

Измените переменную $ path на любую папку, в которой находятся ваши документы.

Отредактируйте раздел #Rename с помощью любой дополнительной логики, которую вы добавили. Регулярное выражение, которое я добавил, соответствует конкретному примеру, представленному вами в вашем посте, подправьте его так, чтобы он соответствовал всем вашим документам. На любой шаблон внутри (круглых скобок) можно ссылаться с помощью массива «match []», начиная с индекса 1.

Я бы предложил закомментировать строку «Rename-Item», пока вы не убедитесь, что «$ newName» является правильным. Добавлен дополнительный $(), добавленный вокруг переменных в строке «$ newName =», чтобы переменные расширились.

PS: Обязательно включите запуск сценариев powershell, откройте PS как администратор и введите: «Set-ExecutionPolicy RemoteSigned»)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .