如何使用PowerShell将多个xls文件转换为csv?

我试图使用以下PowerShell脚本将多个Excel文件(xls)转换为csv:

$excel = new-object -ComObject "Excel.Application" $excel.DisplayAlerts=$True $excel.Visible =$false foreach ($file in get-childitem $src_dir) { $wb = $excel.Workbooks.Open($file.FullName) $wb.SaveAs($dst_dir + $file.Name + ".csv", 6)# 6 -> csv $wb.Close($True) } $excel.Quit() [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 

原则上这工作,例如我得到CSV文件。 但是,对于一些文件(每次运行不同),我会得到一个exception:

 Exception calling "SaveAs" with "2" argument(s): "Microsoft Office Excel cannot access the file 'C:\Users\...\AppData\Local\Temp'. ... 

此外,我收到一个消息框,询问是否要将更改保存到源xls。

一旦我调用SaveAs,$ wb引用新文件。 那么如何保存或放弃对源文件的更改呢? 为什么这只发生在几个文件? 这个脚本还有其他的问题吗?

更新

我将input文件(大约200)任意(即不知道组的大小)分成10组,并自行处理每组。 这有效,所以有点不方便。

提前致谢

尝试移动代码启动并退出excel内部循环。

是的,这种方式比较慢,但它鼓励Excel在每个操作之间清理临时文件。

它不会像你想象的那么慢,因为Windows和COM足够聪明,即使在你离开几秒钟之后,Excel仍然可以保存在内存中,这样下一次创build一个Excel对象时,它将会发生很快喜欢这个。

也许你可以实现一个计时器,等待一段时间? 或者当脚本正在运行时,您可以查看脚本,然后在每个循环之后删除临时文件(一个xls文件转换)。

我相信你可以避免消息框询问是否要使用$wb.Close($False)而不是$wb.Close($True) 。 这就是我通常使用的,我没有得到任何消息框。

我用计时器更新脚本 – 可能不是确切的答案,但会帮助寻找脚本的人:

 $excel = new-object -ComObject "Excel.Application" $excel.DisplayAlerts=$True $excel.Visible =$false $src_dir='D:\folderwithxlsx\' $dst_dir='D:\folderwithcsv\' Get-ChildItem $src_dir -Filter *.xlsx | Foreach-Object{ 'processing '+$_.FullName $wb = $excel.Workbooks.Open($_.FullName) $dst_file=$dst_dir + $_.BaseName + ".csv" $wb.SaveAs($dst_file, 6)# 6 -> csv 'saved '+$dst_file $wb.Close($True) Start-Sleep -Seconds 2 } $excel.Quit() [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)