Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Очистка метаданных в файлах microsoft office

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

Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


Уважаемые форумчане, возникла задача очистить личную информацию в файлах 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
Большое спасибо за помощь!

Отправлено: 06:32, 28-02-2019

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата kudrik_tt:
Если файлы excel обрабатываются не открываясь, »
Открываясь, открываясь:
Цитата:
Код: Выделить весь код
    $docXl = $objExcel.workbooks.open($dxl.fullname)

Отправлено: 07:26, 28-02-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:42, 28-02-2019 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата kudrik_tt:
а файлы word и powerpoint, при запуске, отображают на экране окно, потом закрывают и открывают следующее и так далее. »
Не верю:
Цитата:
Код: Выделить весь код
$objWord = New-Object -ComObject word.application
$objWord.visible = $false
…
$objPp = New-Object -ComObject Powerpoint.application
$objPp.visible = $false
Мало того, что и так свойство .Visible имеет значение False по умолчанию, так его и ещё раз принудительно задают. И всё равно окна Word'а и PowerPoint'а видимы? Не верю.

Цитата kudrik_tt:
можно ли как то сделать, чтобы просто автоматически эти файлы или пропускались или закрывались? »
Теоретически можно попробовать поиграться.

Отправлено: 17:18, 28-02-2019 | #4


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ваше удивление, оправдано, но, я думаю связано не с ...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

Отправлено: 13:34, 01-03-2019 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:54, 01-03-2019 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Iska:
Теоретически можно попробовать поиграться. »
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
Мы тупо задаём пустой пароль и пытаемся открыть Рабочую книгу. В примере первая Рабочая книга под паролем, вторая — нет. При работе кода при попытке открытия первой Рабочей книги возникает перехватываемая ошибка, вторая Рабочая книга корректно открывается с пустым паролем, выводится значение первой ячейки, и Рабочая книга закрывается.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:28, 02-03-2019 | #7


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
ну, вот Вам примерная болванка кода »
Спасибо за помощь, вот строка с 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 как раз и отвечает за открытие (по умолчанию) в видимом режиме(

Отправлено: 13:24, 05-03-2019 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:36, 05-03-2019 | #9


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:07, 06-03-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Очистка метаданных в файлах microsoft office

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Ошибка - [решено] microsoft office 2003 не открывает файлы, сделанные в office 2010 simsa Microsoft Windows 2000/XP 6 26-02-2016 15:58
Microsoft собирается переименовать Office Web Apps в Office Online OSZone News Новости и события Microsoft 0 28-01-2014 11:30
Разное - Как конвертировать базу данных Microsoft Office Acess в Open office Base? tier_skg Хочу все знать 0 08-01-2013 20:36
Microsoft анонсирует выпуск бесплатной версии MS Office - Office Starter 2010 OSZone News Новости и события Microsoft 0 10-10-2009 15:30




 
Переход