作为计划任务运行时,PowerShell脚本无法打开文件

我的PowerShell(2.0)脚本具有以下代码片段:

$fileName = "c:\reports\1.xlsx" $xl = new-object -comobject excel.application $xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault $xl.displayalerts = $false $workbook = $xl.workbooks.open($fileName) #Code to manipulate a worksheet $workbook.SaveAs($fileName, $xlformat) $xl.quit() $error | out-file c:\reports\error.txt 

我可以在PowerShell命令提示符下运行这个脚本,没有任何问题。 电子表格被更新,并且error.txt是空的。 但是,当我在任务计划程序中将其作为任务运行时,第一行出现错误。

使用“1”参数调用“打开”的exception:“Microsoft Office Excel无法访问文件'C:\ reports \ 1.xlsx'。有以下几种可能的原因:文件名或path不存在。正在被另一个程序使用您尝试保存的工作簿与当前打开的工作簿具有相同的名称。

我使用与在PowerShell命令提示符下运行脚本相同的凭据来运行该任务。 当我手动运行脚本时,它可以打开,更新和保存电子表格而不会有任何问题。 当我在任务计划程序中运行它时,它不能访问电子表格。

所讨论的文件对于所有用户是可读/可写的。 我已经validation了我可以使用相同的凭据在Excel中打开文件。 如果我制作一个新的电子表格,并将其名称作为$文件名,我会得到相同的结果。 我已经validation在任务pipe理器中没有Excel.exe的实例。

奇怪的是,如果我使用Get-Content ,我没有任何问题。 另外,如果我制作一个新的电子表格,我没有任何问题。

 $fileName = "c:\reports\1.xlsx" $xl = get-content $filename $xl = new-object -comobject excel.application $xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault $xl.displayalerts = $false # Commented out $workbook = $xl.workbooks.open($fileName) $workbook = $xl.workbooks.add() #Code to manipulate a worksheet $workbook.SaveAs($fileName, $xlformat) $xl.quit() $error | out-file c:\reports\error.txt 

这工作正常。 所以Get-ChildItem可以打开文件没有任何问题。 ComObject可以打开文件,如果我手动运行它,但不是如果它作为任务运行。

我不知所措 有任何想法吗?

在您的计划任务中添加-No Profile开关到powershell.exe(编辑您的任务,转到操作选项卡,编辑您的操作,然后在添加参数字段中添加– 没有configuration文件作为第一个参数。

看看这里:

https://stackoverflow.com/questions/7106381/microsoft-office-excel-cannot-access-the-file-c-inetpub-wwwroot-timesheet-app

你只需要这样做:

  1. 创build目录“C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop”(适用于64位Windows)或“C:\ Windows \ System32 \ config \ systemprofile \ Desktop”
  2. 为目录桌面设置完全控制权限(例如,在用户“IIS AppPool \ DefaultAppPool”的Win7&IIS 7&DefaultAppPool设置权限中)

它为我工作! 希望能帮助到你