2016-02-02 4 views
1

Я пытаюсь организовать большое количество файлов .doc и .docx, но кажется, что их метаданные «Дата изменено» и «Дата создания» неверны - вероятно, все это было потеряно во время перемещения некоторое время назад. Однако метаданные «Дата последнего сохранения» и «Созданные контентом» выглядят правильно, поэтому мне интересно: возможно ли использовать Powershell для замены полей «Дата изменения» и «Дата создания» на информацию из раздела «Дата последней сохраненной» и «Созданный контент». Date last saved "и" Content created "?Как заменить дату, измененную на последнюю сохраненную дату?

+0

Несомненно, это возможно. Просто прочитайте метаданные из файла и измените атрибуты файла. –

ответ

0

CreationTime и LastWriteTime - это свойства файловой системы, их можно получить и установить с помощью get-itemproperty и set-itemproperty.

Creation date и Last save time - это специфичные для текста свойства. The Scripting Guy рассказывает вам, как их читать. Как только вы их прочитаете, установите их с помощью set-itemproperty.

Вот пример того, как читать свойства двух слов и записывать их в свойства файловой системы для всех файлов *.doc и *.docx в текущем каталоге.

$includeExtensions = @(".doc", ".docx") 
$path = "." 
$docs = Get-ChildItem -Path $path | ?{$includeExtensions -contains $_.Extension} 

foreach($doc in $docs) { 
    $application = New-Object -ComObject word.application 
    $application.Visible = $false 
    $document = $application.documents.open($doc.FullName) 
    $binding = "System.Reflection.BindingFlags" -as [type] 
    $properties = $document.BuiltInDocumentProperties 

    $lastsavetime = $null 
    $creationdate = $null 

    foreach($property in $properties) 
    { 
    $pn = [System.__ComObject].invokemember("name",$binding::GetProperty,$null,$property,$null) 
     trap [system.exception] 
     { 
     continue 
     } 
     if($pn -eq "Last save time") { 
      $lastsavetime = [System.__ComObject].invokemember("value",$binding::GetProperty,$null,$property,$null) 
     } elseif ($pn -eq "Creation date") { 
      $creationdate = [System.__ComObject].invokemember("value",$binding::GetProperty,$null,$property,$null) 
     }     
    } 

    $document.Close() 
    $application.quit() 

    "Setting " + $doc.FullName 
    Set-ItemProperty $doc.FullName -Name "Creationtime" -Value $creationdate 
    Set-ItemProperty $doc.FullName -Name "LastWriteTime" -Value $lastsavetime 

} 
+1

Эй, спасибо за вашу помощь! Извините, но я действительно не знаю, что я делаю. Я выяснил, как получить список всех файлов '.doc' и' .docx', которые мне нужно изменить с помощью '$ includeExtensions = @ (" .doc "," .docx ") Get- ChildItem -Path "E: \ Google Диск \ Фактические документы \ Стихи" | ? {$ includeExtensions -contains $ _. Extension} ' Но я не знаю, как передать это во вторую часть скрипта, в частности' $ application.documents.open'. Я также не знаю, как сохранить значения «Дата создания» и «Последнее время сохранения» в качестве переменных из этого раздела скрипта. – RSXS

+0

Итак, вы в основном говорите, что у вас нет ни малейшего представления об основных понятиях PowerShell или программирования. См. Отредактированный ответ для полного рабочего кода. Пожалуйста, отметьте это как правильный ответ. – Marc

Смежные вопросы