【发布时间】:2015-04-12 00:26:22
【问题描述】:
我一直在编写 PowerShell 脚本,目的是每天通过任务计划程序刷新 Excel 文档的 SQL 数据。 Excel 文档托管在 SharePoint 上。我已经(经过多次反复试验)让它工作起来,直到签入部分。
- 基本上,任务计划程序每天都会触发 PowerShell 脚本。
- 该脚本创建一个 Excel COM 对象。
- 它会验证它是否可以签出文档,然后如果可以签出的话。
- 然后执行刷新。
- 最后,它会尝试签入文档。此时,它只是 手,什么也没有发生。我应该注意,这只发生在 脚本通过任务调度程序运行,'无论用户是否登录或 不'被选中。如果从 PowerShell cmd 行或 选中“用户必须登录”选项,一切正常 很好。
几个重要的注意事项- 该帐户是服务帐户用户,尽管我们在测试期间授予它本地登录权限。但在实践中必须无人看管。 我按照此页面上的文件夹说明进行操作- https://social.technet.microsoft.com/Forums/en-US/aede572b-4c1f-4729-bc9d-899fed5fad02/run-powershell-script-as-scheduled-task-that-uses-excel-com-object?forum=winserverpowershell 值得注意的是,我还必须对最初评论之后提到的几篇帖子中提到的文件夹设置权限。我强烈怀疑我当前的问题是相似/相关的——但一定不是这些文件夹,因为我在这里拥有相当开放的权限。
我不得不删除“增强的 IE 安全性”,因为这是一个服务器盒,PowerShell 最初无法“看到”SharePoint 网站。
我已经检查了事件日志-办公室日志显然是可操作的,但在签入时显然没有弹出窗口。
我已经设置并验证了 COM 权限设置,尽管我可能在这里遗漏了一些东西。 Excel 未在 APP 列表中列出,但将用户添加到呼叫权限使我在任务上前进。
如果我以开发管理员身份运行它,我很确定不会发生这种情况。
CYA- 我知道 MS 不认可上述内容,但我也知道人们可以让它发挥作用。 目前,Powerpivot for SharePoint 并不是一个真正的选择。 这就像我有史以来的第三个问题(我通常会用头撞墙,直到我得到它,但我在这里“只是”一个 PowerShell 脚本有点血腥。如果我过于罗嗦/过于罗嗦,请多多包涵:)
下面的截断脚本-(删除了 try/catch 和调试消息。如果您想要清理后的完整消息,请告诉我,我很乐意为别人省去我遇到的麻烦。)
$i = "http://supersecretintranetsite/excelwithsqldatacon.xlsx"
# Creating the excel COM Object
$Excel = New-Object -ComObject Excel.Application;
Start-Sleep -s 5
# Setting up Excel to run without UI and without alerts
$Excel.DisplayAlerts = $false
$Excel.ScreenUpdating = $false
$Excel.Visible = $false
$Excel.UserControl = $false
$Excel.Interactive = $false
If ($Excel.workbooks.CanCheckOut($i))
{
# Opening the workbook, can be local path or SharePoint URL
$Workbook = $Excel.workbooks.Open($i);
# Perform the check out
$Workbook = $Excel.workbooks.CheckOut($i)
$Workbook = $Excel.workbooks.Open($i);
Start-Sleep -s 15
# Calling the refresh
$Workbook.RefreshAll();
# Forces a hold until all Refreshing is done
$Excel.CalculateUntilAsyncQueriesDone()
# Saving and closing the workbook
# $Workbook.Save() #- this hangs too
Start-Sleep -s 15
# THIS HANGS
$Workbook.CheckInWithVersion();
Start-Sleep -sec 5
#Release Workbook
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Workbook)
}
$Excel.quit();
【问题讨论】:
标签: excel powershell sharepoint