Используя этот 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»)