这有点与SharePoint有关,但我认为问题的本质实际上并不是SharePoint特定的。
情况是这样的。 我正在使用第三方 SharePoint 加载项。 安装此加载项后,它会在记录库的"SharePoint 库设置"页中提供一个链接。 如果单击该链接,它将执行一些代码并对库执行一些配置(安装自定义内容类型等(。
链接本身执行一些Javascript:
function dialogCallback()
{
SP.UI.Notify.addNotification('Content types installed and settings configured.');
SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK);
}
function openInstallContentTypesDialog()
{
var options = SP.UI.$create_DialogOptions();
options.url = 'http://my.sharepoint.site/_layouts/Custom/Feature/ExecuteConfigurationCode.aspx?SiteUrl=http://my.sharepoint.site&ListId={6767676a-0101-b4dc-a67a-67a67a67a67a}';
options.dialogReturnValueCallback = Function.createDelegate(null, dialogCallback);
SP.UI.ModalDialog.showModalDialog(options);
}
openInstallContentTypesDialog();
我需要配置 ~50 个库,所以我宁愿不必通过 UI 进入每个库的设置页面并单击该链接。 (特别是因为我将不得不多次执行此操作,因为我在多个开发/测试/等环境中设置了服务器场。 我宁愿编写一个Powershell脚本,循环浏览所有库,并以某种方式模拟单击该链接并调用ExecuteConfigurationCode.aspx
页面。 我知道我可以通过 Powershell 获取查询字符串(站点 URL 和列表 ID(所需的信息,但我无法弄清楚如何触发 aspx 页面的代码。
我做了一些挖掘,发现一些帖子说使用System.Net.WebClient
对象并调用DownloadString()
。 像这样:
$web = get-spweb http://my.sharepoint.site
$list = $web.Lists["My Record Library"]
$requestUrl = $web.Url+"/_layouts/Custom/Feature/ExecuteConfigurationCode.aspx"
$querystring = new-object system.collections.specialized.namevaluecollection
$querystring.Add("SiteUrl", $web.Url)
$querystring.Add("ListId", "{"+$list.Id.Tostring()+"}")
$webclient = new-object system.net.webclient
$webclient.Credentials = new-object system.net.networkcredential("Site Collection Admin", "password")
$webclient.QueryString = $querystring
$response = $webclient.downloadstring($requestUrl)
而且,尽管我确实获得了构成页面的所有 HTML,但 aspx 页面背后的代码并未执行。
我还尝试了UploadString()
方法,看看它是否需要是 POST。 这有相同的结果 - 页面的所有 HTML 都返回给我,但 aspx 页面的服务器端代码没有执行。
那么......我如何模拟通过Powershell单击该链接? (另请记住,由于它是 SharePoint,我使用的是 SharePoint 2010 Management Shell,即 Powershell 2.0。 所以我不能使用 Invoke-WebRequest
cmdlet。
你有没有尝试过使用 IE COM 对象:
$url = "http://blabla/"
$ie = New-Object -com InternetExplorer.Application
$ie.visible = $true;
$ie.navigate($url);
$ie.Document.getElementByID("a_componenent_id").value="blabla"
$ie.Document.getElementById("A_Form").submit()
or
$button = $ie.Document.getElementsByTagName("input")
$button.item(0).Click()