计划任务运行时,PowerShell脚本无法访问文件。

18

我的 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”个参数调用“Open”时出错: “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可以打开文件,但如果作为任务运行则无法打开。

我不知道该怎么办了。有任何想法吗?


当通过 aws ssm send-command 运行时,此问题也会出现。 - enharmonic
你解决了这个问题吗?对我来说,Excel的登录窗口每次都会弹出。 - user3290656
5个回答

32

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

你需要创建一个文件夹(如果是64位windows则需要创建两个):

(32位系统,始终如此)

C:\Windows\System32\config\systemprofile\Desktop

(64位系统)

C:\Windows\SysWOW64\config\systemprofile\Desktop

我也遇到过这个问题,这是我找到的唯一解决方法。

引用自 TechNet论坛 (通过PowerShell和Excel自动化时出现的问题)


1
这个方法也适用于 MSWord 和 Visio 自动化遇到相同的问题。 - CJBS
1
此外,您可能还需要授予该帐户对新创建的桌面文件夹的权限。 - John G Hohengarten
在使用来自链接资源的代码时要小心,它们需要名为"Dektop"(而不是"Desktop")的文件夹,添加一个名为"Dektop"的文件夹并不能解决任何问题... - David Rogers

1

1
我必须将我的定时任务设置为“仅在用户已登录”(以运行任务的服务账户登录到服务器,然后断开会话),因为这似乎是任务计划程序和Excel之间的限制。这是一个相当弱的解决方案,但它有效。

1

为了扩展@TessellatingHeckler提供的内容,您可以在PowerShell中运行以下命令(作为管理员/提升权限),以在打开Excel之前创建文件夹,在我的脚本中,这解决了问题:

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
}

0
重新强调TessellatingHeckler所说的。我不得不在64位系统上解决这个问题,所以我使用了以下命令,最终使PowerShell脚本通过任务计划程序正常工作:
New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Daniel Mann
这被标记为未提供问题答案,并被划掉了。它被完全相同的东西所取代。我复制/粘贴了我在PowerShell脚本中使用的行,以使我的脚本在我的答案中起作用。我不明白为什么我的答案被标记为非答案,然后被你用完全相同的东西替换了。 - Nakuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接