目标:以编程方式将文档上传到 Sharepoint
问题 :
尝试使用时:
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
它不会出错,但当我尝试使用它包含的对象时会出错。比如New-Object Microsoft.SharePoint.SPSite($url)
。解决此问题的方法是下载“Microsoft.Sharepoint.dll”,该文件包含在安装 MOSS 的实际服务器上的 Web 扩展文件夹中。问题在于,在托管我们的 Sharepoint 站点的 2008 服务器上运行这些脚本在大公司中绝不是“实用的”。我的第二种方法是使用 Internet Explorer com 对象物理导航到页面并从那里上传文件。获得文本框的 ID 后,我无法设置该值,因为我的研究显示微软的“安全措施”。使用
get-member
cmdlet 时,我可以看到这个 html 元素的字段值应该是“System.String value {get;set;}”。当我尝试设置该值时,没有任何反应。网站上的文本框本身不允许您输入任何内容。相反,文本框是可点击的,并会显示“选择要上传的文件”窗口。如果我手动选择要上传的文件而不提交,请返回 ISE 并执行$uploadText.Value
它会吐出我刚刚选择控制台的文件。我的第三个努力是使用 VB 中的 sendkeys 对象将路径发送到 Web 浏览器并以这种方式上传文件。但是在运行它时,程序只是挂起并且从不发送它。我在http://technet.microsoft.com/en-us/library/ff731008找到的这个策略被描述为“有点……喜怒无常……”。我首先让 $ie 对象打开 Microsoft 文件浏览器,然后尝试向它发送密钥。
尝试的代码:(使用 IE com 对象、AppActivate 和 Sendkeys):
$spURL = "https://SharepointSite"
[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
$ie = new-object -com "InternetExplorer.Application"
$ie.visible = $true
$ie.navigate2($spURL)
while($ie.Busy -eq $true) {Start-Sleep 1}
($ie.Document.GetElementByID("zz16_UploadMenu")).click()
while($ie.Busy -eq $true) {Start-Sleep 1}
$uploadText = $ie.Document.GetElementByID("ctl00_PlaceHolderMain_ctl01_ctl02_InputFile")
[Microsoft.VisualBasic.Interaction]::AppActivate("Upload Document")
$uploadText.value = "C:\uploadFile.xlsx" #this line does nothing
$uploadText.click() ## opens up "choose file to upload"
[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[System.Windows.Forms.SendKeys]::SendWait("C:\uploadFile.xlsx")
就是这样,浏览器框弹出,脚本永远不会结束。我发现其他一些人在将 AppActivate 设置为“选择要上传的文件”(在将其更改为 IE 标题“上传文档”之前将其设置为)时遇到了麻烦。虽然这些问题都在 VB 中,但我确实找到了有人声称是“引用 Microsoft HTML 库”的修复程序,但它只适用于 VB,我需要在 powershell 中使用它。可以在此处找到该修复程序,但它对我不起作用。
微软似乎只是不希望我以编程方式上传文件。但在我认为这是“不可能”之前,我只想先在这里发布。任何帮助将不胜感激,我认为使用 powershell 一切皆有可能!:D