Пакетный экспорт Powershell / конвертировать Excel в TXT (Unicode) - PullRequest
0 голосов
/ 06 сентября 2018

Цель состоит в том, чтобы преобразовать все файлы xls в каталоге (с подпапками) в txt (unicode), сохраняя txt в тех же местах с теми же именами, что и исходные файлы xls. У меня так, не работает:

$files = Get-ChildItem D:\test\*.xls -recurse
Write "Loading Files..."

$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $false
$Excel.DisplayAlerts = $false

ForEach ($file in $files)
{
     $WorkBook = $Excel.Workbooks.Open($file.Fullname)
     $NewFilepath = $file.Fullname -replace ".{4}$"
     $NewFilepath =  $NewFilepath + ".txt"
     $Workbook.SaveAs($NewFilepath,42)   
}
  Stop-Process -processname EXCEL
  $Excel.Quit()

Это дает исключение:

No access to 'FileName.txt'.
At line:13 char:6
+      $Workbook.SaveAs($NewFilepath,42)
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

1 Ответ

0 голосов
/ 06 сентября 2018

Я думаю, что это связано с тем, как вы убиваете процесс 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 после использования (об этом позаботятся четыре строки внизу)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...