我的 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”个参数调用“打开”时发生异常:“Microsoft Office Excel 无法访问文件‘C:\reports\1.xlsx’。可能的原因有以下几种:文件名或路径不存在。该文件正在被另一个程序使用。您尝试保存的工作簿与当前打开的工作簿同名。
我使用在 PowerShell 命令提示符中运行脚本时使用的相同凭据来运行该任务。当我手动运行该脚本时,它可以打开、更新和保存电子表格,没有任何问题。当我在任务计划程序中运行它时,它无法访问电子表格。
所有用户均可读取/写入相关文件。我已确认我可以在Excel使用相同的凭据。如果我创建一个新的电子表格并将其名称作为 $filename 输入,我会得到相同的结果。我已经验证了任务管理器。
奇怪的是,如果我使用获取内容,我没有遇到任何问题。此外,如果我制作新的电子表格,也不会遇到任何问题。
$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
效果很好。所以获取子项可以毫无问题地打开文件。如果我手动运行 ComObject,它可以打开文件,但如果以任务形式运行,则不能。
我很困惑。有什么想法吗?
答案1
添加-无个人资料在计划任务中切换到 powershell.exe(编辑任务,转到操作选项卡,编辑您的操作,然后在添加参数字段,添加-无个人资料作为第一个参数。)
答案2
请看这里:
您只需这样做:
- 创建目录“C:\Windows\SysWOW64\config\systemprofile\Desktop”(适用于 64 位 Windows)或“C:\Windows\System32\config\systemprofile\Desktop”(适用于 32 位 Windows)
- 设置目录桌面的完全控制权限(例如在 Win7 & IIS 7 & DefaultAppPool 中为用户“IIS AppPool\DefaultAppPool”设置权限)
对我来说很管用!希望它能有所帮助