Всегда просматривайте код по одному блоку за раз, чтобы убедиться, что вы получаете то, что ожидаете.
Я использую сценарий отладки моего бедняка, используя сжатие переменной , что означает присвоение результатов переменной при автоматическом выводе на экран. Вы заметите, что все работает как положено, и вопрос Ли о том, какие ошибки вы получили, является разумным вопросом.
Ваше утверждение:
Я пытался ответить на вопрос здесь, но у меня это не сработало.
... на самом деле не проясняется заявление.
($XlsFiles = Get-ChildItem -Path 'D:\Temp' -Filter 'File*.xl*')
<#
# Results
Directory: D:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 28-Apr-20 15:49 9811 FileData.xlsx
-a---- 28-Apr-20 15:50 16384 FileDataProtected.xlsx
#>
($XlsFiles = Get-ChildItem -Path 'D:\Temp' -Filter 'File*.csv')
<#
# Results
Directory: D:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 06-Apr-20 00:54 260 FileData.csv
#>
($filepath = 'D:\Temp\FileDataProtected.xlsx')
($password = 'omgpassword')
<#
# Results
D:\Temp\FileDataProtected.xlsx
omgpassword
#>
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $true
Почему вы здесь набираете? Это действительно не гарантировано.
# ($wb = $excel.Workbooks.Open($filepath, [Type]::Missing, [Type]::Missing, [Type]::Missing, $password))
<#
# Results
Application : Microsoft.Office.Interop.Excel.ApplicationClass
Creator : 1480803660
Parent : Microsoft.Office.Interop.Excel.ApplicationClass
AcceptLabelsInFormulas : False
ActiveChart :
ActiveSheet : System.__ComObject
Author :
AutoUpdateFrequency : 0
AutoUpdateSaveChanges :
ChangeHistoryDuration : 0
BuiltinDocumentProperties : System.__ComObject
Charts : System.__ComObject
CodeName :
_CodeName :
CommandBars :
Comments :
ConflictResolution : 1
Container :
CreateBackup : False
CustomDocumentProperties : System.__ComObject
Date1904 : False
DialogSheets : System.__ComObject
DisplayDrawingObjects : -4104
FileFormat : 51
FullName : D:\Temp\FileDataProtected.xlsx
...
#>
($wb = $excel.Workbooks.Open($filepath,0,0,5,$password))
<#
# Results
Application : Microsoft.Office.Interop.Excel.ApplicationClass
Creator : 1480803660
Parent : Microsoft.Office.Interop.Excel.ApplicationClass
AcceptLabelsInFormulas : False
ActiveChart :
ActiveSheet : System.__ComObject
Author :
AutoUpdateFrequency : 0
AutoUpdateSaveChanges :
ChangeHistoryDuration : 0
BuiltinDocumentProperties : System.__ComObject
Charts : System.__ComObject
CodeName :
_CodeName :
CommandBars :
Comments :
ConflictResolution : 1
Container :
CreateBackup : False
CustomDocumentProperties : System.__ComObject
Date1904 : False
DialogSheets : System.__ComObject
DisplayDrawingObjects : -4104
FileFormat : 51
FullName : D:\Temp\FileDataProtected.xlsx
...
#>
Вы не используете это нигде в том, что вы опубликовали, ооо, зачем это делать? Это займет много времени, чтобы завершить то, что вы не используете.
#>
($sheet = $wb.ActiveSheet)
<#
# Results
Application : Microsoft.Office.Interop.Excel.ApplicationClass
Creator : 1480803660
Parent : System.__ComObject
CodeName :
_CodeName :
Index : 1
Name : FileData
...
#>
$wb.SaveAs('D:\Temp\FileDataUnProtected.csv',6,'')
<#
# Results
Когда вы сделаете это, конечно, Excel будет кричать вам о потере данных, переключаясь с Xlsx на CSV.
# Clean-up
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
<#
# Results
6
#>
($XlsFiles = Get-ChildItem -Path 'D:\Temp' -Filter 'File*.csv')
<#
# Results
Directory: D:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 06-Apr-20 00:54 260 FileData.csv
-a---- 28-Apr-20 16:21 129 FileDataUnProtected.csv
#>
Get-Content -Path 'D:\Temp\FileDataUnProtected.csv'
<#
# Results
0 minutes
0 minutes
1 day and 19 hours
1 day and 2 hours
1 day and 20 hours
1 day and 23 hours
13 hours
2 days
20 hours
#>
Import-Csv -Path 'D:\Temp\FileDataUnProtected.csv'
<#
# Results
0 minutes
1 day and 19 hours
1 day and 2 hours
1 day and 20 hours
1 day and 23 hours
13 hours
2 days
20 hours
#>
Наконец, это не имеет особого смысла, поскольку у вас есть только один COM-объект для удаления, остальные являются просто переменными и должны быть очищены с помощью командлета Remove-Variable
finally {
$sheet, $wb, $excel | ForEach-Object {
if ($_ -ne $null) {
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($_)
}
}