kudrik_tt
28-02-2019, 06:32
Уважаемые форумчане, возникла задача очистить личную информацию в файлах 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
Большое спасибо за помощь!
Пришлось с помощью интернета написать скрипт (не очень хороший), который прилагаю ниже, но есть проблема - в 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
Большое спасибо за помощь!