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

ffx8fchx  于 2023-01-10  发布在  Shell
关注(0)|答案(5)|浏览(218)

我的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可以打开文件,但如果作为任务运行,则不能。
我不知道。有什么主意吗?

z4iuyo4d

z4iuyo4d1#

我认为您遇到了Excel中的一个错误:
你必须创建一个文件夹(或两个64位窗口):
(32位,始终)
C:\Windows\系统32\配置\系统配置文件\桌面
(64位)
C:\Windows\SysWOW64\配置\系统配置文件\桌面
我也遇到过同样的问题,这是我找到的唯一解决办法。
TechNet Forums(通过PowerShell and Excel Issue when Automating

2cmtqfgy

2cmtqfgy2#

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

yqhsw0fo

yqhsw0fo3#

要扩展@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
}
wh6knrhe

wh6knrhe4#

我不得不设置我的任务计划运行'只有当用户登录'(登录到服务器作为服务帐户运行任务,然后断开会话),因为它似乎是一个限制与任务计划和Excel。这是一个相当蹩脚的变通办法,但它的工作。

oxalkeyp

oxalkeyp5#

为了重申TessellatingHeckler所说的,我必须在64位系统上解决这个问题,所以我使用了以下命令,使PowerShell脚本最终通过任务计划程序工作:

New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop

相关问题