PowerShell - Очистка метаданных в файлах microsoft office

Ответить
Аватара пользователя
kudrik_tt

PowerShell - Очистка метаданных в файлах microsoft office

Сообщение kudrik_tt »

Уважаемые форумчане, возникла задача очистить личную информацию в файлах office, нашел пару программ, но работали они не идеально, основной проблемой было что они все меняли дату изменения файла, некоторые работали только со старыми форматами office, некоторые не запускались на серверной версии Windows.

Пришлось с помощью интернета написать скрипт (не очень хороший), который прилагаю ниже, но есть проблема - в excel, если попадается файл с паролем, то excel открывает его и ждет, ввода пароля, можно ли как то сделать, чтобы просто автоматически эти файлы или пропускались или закрывались? Если файлы excel обрабатываются не открываясь, то word и powerpoint почему то открываются, обрабатываются и закрываются, это обязательно? или можно как то поправить, я не большой специалист по Powershell, обычно использую его для отчетов по резервному копированию, да очистки временных файлов.



вот скрипт:



Код:

Код: Выделить всё

#Очистка медаданных у файлов Excel
$path = "D:\test\" 
$Date = Get-Date -Format "dd.MM.yyyy"
New-Item -Path $PSScriptRoot\MataData -ItemType Directory
Add-Type -AssemblyName Microsoft.Office.Interop.Excel 
$xlRemoveDocType = "Microsoft.Office.Interop.Excel.XlRemoveDocInfoType" -as [type] 
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx, *.xlsm -recurse 
$objExcel = New-Object -ComObject excel.application 
$objExcel.visible = $false 
$objExcel.displayalerts = $false
$Errors = 0
$i = 0
"Файлы с удаленной информацией:" | Out-File -FilePath $PSScriptRoot\MataData\logXl-$Date.txt
"Ошибка очистки метаданных:" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt
foreach($dxl in $excelFiles) 
{ 
 try{
    $dateCreXl = $dxl.CreationTime
    $dateLastXl = $dxl.LastWriteTime
    $docXl = $objExcel.workbooks.open($dxl.fullname) 
    #$objExcel.displayalerts = $false
    "$dxl" | Out-File -FilePath $PSScriptRoot\MataData\logXl-$Date.txt -Append
    $i = $i + 1
    $docXl.RemoveDocumentInformation($xlRemoveDocType::xlRDIAll) 
    $docXl.Save() 
    $objExcel.ActiveWorkbook.close()
    $dxl.CreationTime = $dateCreXl
    $dxl.LastWriteTime = $dateLastXl
    }
 catch{
      "$dxl" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
      $Errors = $Errors + 1
      }
} 
$objExcel.Quit()
"Удаление метаданных в файлах Excel завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\logXl-$Date.txt -Append
"Удаление метаданных в файлах Excel завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
#Очистка медаданных у файлов Word
$path = "D:\test\"
Add-Type -AssemblyName Microsoft.Office.Interop.Word
$WdRemoveDocType = "Microsoft.Office.Interop.Word.WdRemoveDocInfoType" -as [type]
$wordFiles = Get-ChildItem -Path $path -include *.doc, *.docx, *.docm -recurse
$objWord = New-Object -ComObject word.application
$objWord.visible = $false 
$Errors = 0
$i = 0
"Файлы с удаленной информацией:" | Out-File -FilePath $PSScriptRoot\MataData\logW-$Date.txt
foreach($dwr in $wordFiles) 
{
 try{ 
    $dateCreW = $dwr.CreationTime
    $dateLastW = $dwr.LastWriteTime
    $docW = $objWord.Documents.Open($dwr.fullname) 
    #$objWord.CheckCompatibility = $false
    "$dwr" | Out-File -FilePath $PSScriptRoot\MataData\logW-$Date.txt -Append
    $i = $i + 1
    $docW.RemoveDocumentInformation($WdRemoveDocType::wdRDIAll) 
    $docW.Save() 
    $objWord.documents.close() 
    $dwr.CreationTime = $dateCreW
    $dwr.LastWriteTime = $dateLastW
    }
 catch{
      "$dwr" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
      $Errors = $Errors + 1
      }
} 
$objWord.Quit()
"Удаление метаданных в файлах Word завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\logW-$Date.txt -Append
"Удаление метаданных в файлах Word завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
#Очистка медаданных у файлов PowerPoint
$path = "D:\test\"
Add-Type -AssemblyName Microsoft.Office.Interop.PowerPoint
$PpRemoveDocType = "Microsoft.Office.Interop.PowerPoint.PpRemoveDocInfoType" -as [type]
$PpFiles = Get-ChildItem -Path $path -include *.ppt, *.pptx, *.pptm -recurse
$objPp = New-Object -ComObject Powerpoint.application
$objPp.visible = $false 
$Errors = 0
$i = 0
"Файлы с удаленной информацией:" | Out-File -FilePath $PSScriptRoot\MataData\logPp-$Date.txt
foreach($pp in $PpFiles) 
{ 
 try{
    $dateCrePp = $pp.CreationTime
    $dateLastPp = $pp.LastWriteTime
    $docPp = $objPp.Presentations.Open($pp.fullname)
    #$objPp.displayalerts = $false
    "$pp" | Out-File -FilePath $PSScriptRoot\MataData\logPp-$Date.txt -Append 
    $i = $i + 1
    $docPp.RemoveDocumentInformation($PpRemoveDocType::ppRDIAll) 
    $docPp.Save() 
    $docPp.close()
    $pp.CreationTime = $dateCrePp
    $pp.LastWriteTime = $dateLastPp 
    }
 catch{
      "$pp" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
      $Errors = $Errors + 1
      }
} 
$objPp.Quit()
"Удаление метаданных в файлах PowerPoint завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\logPp-$Date.txt -Append
"Удаление метаданных в файлах PowerPoint завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append

Большое спасибо за помощь!
Аватара пользователя
Iska

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение Iska »

Цитата kudrik_tt:



Если файлы excel обрабатываются не открываясь,
PowerShell - Очистка метаданных в файлах microsoft office




Открываясь, открываясь:


Цитата:





Код:

Код: Выделить всё

    $docXl = $objExcel.workbooks.open($dxl.fullname)
Аватара пользователя
kudrik_tt

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение kudrik_tt »

Цитата Iska:



Открываясь, открываясь:
PowerShell - Очистка метаданных в файлах microsoft office




Да, открываясь, но окно не выводится на экран, а файлы word и powerpoint, при запуске, отображают на экране окно, потом закрывают и открывают следующее и так далее.
Аватара пользователя
Iska

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение Iska »

Цитата kudrik_tt:



а файлы word и powerpoint, при запуске, отображают на экране окно, потом закрывают и открывают следующее и так далее.
PowerShell - Очистка метаданных в файлах microsoft office




Не верю:


Цитата:





Код:

Код: Выделить всё

$objWord = New-Object -ComObject word.application
$objWord.visible = $false
…
$objPp = New-Object -ComObject Powerpoint.application
$objPp.visible = $false





Мало того, что и так свойство .Visible имеет значение False по умолчанию, так его и ещё раз принудительно задают. И всё равно окна Word'а и PowerPoint'а видимы? Не верю.


Цитата kudrik_tt:



можно ли как то сделать, чтобы просто автоматически эти файлы или пропускались или закрывались?
PowerShell - Очистка метаданных в файлах microsoft office




Теоретически можно попробовать поиграться.
Аватара пользователя
kudrik_tt

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение kudrik_tt »

Ваше удивление, оправдано, но, я думаю связано не с ...visible=$false, а то что эта функция не правильно обрабатывается, и выдает ошибку





Код:

Код: Выделить всё

Исключение при задании "visible" : "Не удается преобразовать значение "False" в тип "Microsoft.Office.Core.MsoTriState". Ошибка: "Недопустимое приведение "System.Boolean"
 к "Microsoft.Office.Core.MsoTriState".""
C:\Users\Администратор.WIN-RSML3SOA2AC\Desktop\Remove-ExcelDocumentInformation.ps1:77 знак:1
+ $objPp.visible = $false
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting
Аватара пользователя
Iska

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение Iska »

kudrik_tt, я не пробовал исполнять код. Сейчас попробовал — таки да, именно так. Рекомендуют пользовать параметры метода .Open коллекции .Presentations.
Аватара пользователя
Iska

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение Iska »

Цитата Iska:



Теоретически можно попробовать поиграться.
PowerShell - Очистка метаданных в файлах microsoft office




kudrik_tt, ну, вот Вам примерная болванка кода:



Код:

Код: Выделить всё

$oExcel = New-Object -ComObject 'Excel.Application'
$oExcel.Visible = True
"C:\Мои проекты\0248\Лист Microsoft Excel.xls", "C:\Мои проекты\0248\Лист Microsoft Excel 2.xls" |`
    ForEach-Object -Process {
        try {
            $oWorkbook = $oExcel.Workbooks.Open($_, $false, $false, 1, "")
            Write-Host $oWorkbook.Worksheets.Item(1).Cells(1, 1).Value()
            $oWorkbook.Close()
        } catch {
            Write-Host 'An error occurred.'
        }
    }
$oExcel.Quit()


Цитата:





Код:

Код: Выделить всё

An error occurred.
asd





Мы тупо задаём пустой пароль и пытаемся открыть Рабочую книгу. В примере первая Рабочая книга под паролем, вторая — нет. При работе кода при попытке открытия первой Рабочей книги возникает перехватываемая ошибка, вторая Рабочая книга корректно открывается с пустым паролем, выводится значение первой ячейки, и Рабочая книга закрывается.
Аватара пользователя
kudrik_tt

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение kudrik_tt »

Цитата Iska:



ну, вот Вам примерная болванка кода
PowerShell - Очистка метаданных в файлах microsoft office




Спасибо за помощь, вот строка с excel, чтобы при пароле, он пропустил этот файл и добавил в ошибку:



Код:

Код: Выделить всё

$docXl = $objExcel.workbooks.open($dxl.fullname,0,$false,1,"","",$true,$true,$false,$false)

Чтобы не открывалось окно PowerPoint -



Код:

Код: Выделить всё

$docPp = $objPp.Presentations.Open($pp.fullname,$false,$false,$false)

А вот чтобы не открывался word большая загадка, вроде все параметры верно, но вот если в строке



Код:

Код: Выделить всё

$docW = $objWord.Documents.Open($dwr.fullname,$false,$false,$false,"","",$false,"","",$false,$false,$true)

изменить последнее $true на $false - программа не обрабатывает файлы, а $true как раз и отвечает за открытие (по умолчанию) в видимом режиме(
Аватара пользователя
Iska

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение Iska »

kudrik_tt, для Microsoft Word не нужно использовать данный механизм, он и так по умолчанию работает в невидимом окне.
Аватара пользователя
Iska

Re: PowerShell - Очистка метаданных в файлах microsoft office

Сообщение Iska »

С вордом, если честно все норм, а вот как powerpoint отучить останавливаться на паролях как Excel непонятно, так же как и у Excel по документам не сделаешь.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»