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

Posted

技术标签:

【中文标题】作为计划任务运行时,Powershell 脚本无法访问文件【英文标题】:Powershell script cannot access a file when run as a Scheduled Task 【发布时间】:2014-05-05 09:46:02 【问题描述】:

我的 Powershell (2.0) 脚本有以下代码 sn-p:

$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运行时也会出现这个问题 您解决了这个问题吗?对我来说,每次都会弹出excel登录窗口。 【参考方案1】:

我认为您在 Excel 中遇到了错误:

您必须创建一个文件夹(或在 64 位 Windows 上创建两个):

(32 位,始终)

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

(64位)

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

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

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

【讨论】:

在遇到相同问题时,这也适用于 MSWord 和 Visio 自动化。 此外,您可能还需要授予帐户对新创建的桌面文件夹的权限。 使用链接源代码时要小心,它们有名为“Dektop”的所需文件夹(相对于“Desktop”),添加一个名为“Dektop”的文件夹并不能解决任何问题......跨度> 【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我必须将我的计划任务设置为“仅在用户登录时”运行(作为运行任务的服务帐户登录到服务器然后断开会话),因为这似乎是任务计划程序和 Excel 的限制。这是一个相当蹩脚的解决方法,但它确实有效。

【讨论】:

以上是关于作为计划任务运行时,Powershell 脚本无法访问文件的主要内容,如果未能解决你的问题,请参考以下文章

计划的 Powershell 触发时不会运行,手动运行时不会停止运行

Powershell 脚本不通过计划任务运行

powershell PowerShell脚本,用于创建在计算机启动时运行choco升级的计划任务

PowerShell 脚本不会作为 Windows 计划任务执行

PowerShell 添加任务以使用参数运行 PowerShell 脚本

powershell 用于运行powershell脚本的计划任务条目