Я думаю, что это связано с тем, как вы убиваете процесс Excel, прежде чем выйти из него.
Попробуйте так:
$files = Get-ChildItem D:\test\*.xls -recurse
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $false
$Excel.DisplayAlerts = $false
ForEach ($file in $files) {
Write "Loading File '$($file.Name)'..."
$WorkBook = $Excel.Workbooks.Open($file.Fullname)
$NewFilePath = [System.IO.Path]::ChangeExtension($file.Fullname,".txt")
$Workbook.SaveAs($NewFilepath, 42) # xlUnicodeText
}
# cleanup
$Excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($WorkBook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
Как видите, я также изменил метод создания нового имени файла с помощью метода [System.IO.Path]::ChangeExtension()
. Это облегчит задачу, если в какой-то момент вам придется иметь дело с .xlsx
файлами.
Кроме того, всегда выпускайте ComObjects после использования (об этом позаботятся четыре строки внизу)