作为计划任务运行时,Powershell脚本无法访问文件

时间:2014-03-26 18:46:39

标签: excel powershell com scheduled-tasks powershell-v2.0

My 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,我会得到相同的结果。我已验证任务管理器中没有Excel.exe实例。

奇怪的是,如果我使用get-content,我就不会有任何问题。另外,如果我制作新的电子表格,我也没有任何问题。

$fileName = "c:\reports\1.xlsx"
$xl = get-content $spreadsheet
$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可以打开该文件,但如果它作为任务运行则不能。

我不知所措。有什么想法吗?

4 个答案:

答案 0 :(得分:19)

我认为你在Excel中遇到了一个错误:

  

您必须创建一个文件夹(或64位窗口上的两个文件夹):

     

(32位,总是)

     

C:\的Windows \ system32 \设置\ systemprofile \桌面

     

(64Bit)

     

C:\的Windows \ Syswow64资料\配置\ systemprofile \桌面

     

我遇到了同样的问题,这是我唯一的解决方案   找到。

来自TechNet Forums(通过PowerShell and Excel Issue when Automating

答案 1 :(得分:1)

上述解决方案在我的SCSM 2012 Scorch环境中不起作用,而是使用了PSExcel(https://github.com/RamblingCookieMonster/PSExcel),它不依赖于安装Excel或ComObject。

答案 2 :(得分:1)

要扩展@TessellatingHeckler提供的内容,可以在打开Excel之前在Powershell(以管理员身份/高权限)中运行以下命令来创建文件夹,在我的脚本中,此问题已解决:

New-Item -ItemType Directory -Force -Path C:\Windows\System32\config\systemprofile\Desktop
if ([Environment]::Is64BitProcess -ne [Environment]::Is64BitOperatingSystem)
{
    New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop
}

答案 3 :(得分:0)

我不得不将计划任务设置为“仅在用户登录时才运行”(作为运行任务的服务帐户登录服务器,然后断开会话连接),因为这似乎是任务计划程序和Excel的限制。这是一个相当la脚的解决方法,但是它可以工作。