Я написал скрипт, который вставляет некоторые тестовые данные в библиотеку документов.Я намерен использовать его в качестве шага после развертывания в Visual Studio 2010, чтобы библиотека не была пустой после ретракта и развертывания.
Соответствующие части сценария:
Install.ps1:
$scriptDirectory = Split-Path -Path $script:MyInvocation.MyCommand.Path -Parent
. "$scriptDirectory\Include.ps1"
$webUrl = "http://localhost/the_site_name"
$web = Get-SPWeb($webUrl)
...
Include.ps1:
function global:Get-SPSite($url)
{
return new-Object Microsoft.SharePoint.SPSite($url)
}
function global:Get-SPWeb($url,$site)
{
if($site -ne $null -and $url -ne $null){"Url OR Site can be given"; return}
#if SPSite is not given, we have to get it...
if($site -eq $null){
$site = Get-SPSite($url);
...
}
Работает нормально при запуске из командной строки следующим образом, дажесразу после повторного развертывания Visual Studio:
powershell \source\ProjectFiles\TestData\Install.ps1
Однако это не работает, когда я использую ту же команду, что и командная строка после развертывания, в свойствах проекта SharePoint в Visual Studio:
Run Post-Deployment Command:
New-Object : Exception calling ".ctor" with "1" argument(s): "The Web applicati
on at http://localhost/the_site_name could not be found. Verify that you have t
yped the URL correctly. If the URL should be serving existing content, the syst
em administrator may need to add a new request URL mapping to the intended appl
ication."
At C:\source\ProjectFiles\TestData\Include.ps1:15 char:18
+ return new-Object <<<< Microsoft.SharePoint.SPSite($url)
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvoca
tionException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.Power
Shell.Commands.NewObjectCommand
Интересно, что я могу воспроизвести ошибку в командной строке, если я выполню:
c:\windows\Syswow64\WindowsPowerShell\v1.0\powershell \source\ProjectFiles\TestData\Install.ps1
Однако команда после развертывания завершается неудачно, даже если я явно запускаю \windows\System32\WindowsPowerShell\v1.0\powershell
и \windows\Syswow64\WindowsPowerShell\v1.0\powershell
.
Обновление: решение найдено
У меня, похоже, проблема, аналогичная обсуждаемой здесь:
http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/faa25866-330b-4e60-8eee-bd72dc9fa5be
Я не могу получить доступ к 64-битному API SharePoint с помощью 32-битных клиентов.Поскольку Visual Studio является 32-разрядным, действие после развертывания будет выполняться в 32-разрядном процессе и завершится ошибкой.Однако существует 64-разрядная версия MSBuild.Если мы позволим ему запустить сценарий PowerShell, все будет в порядке.
Оберните сценарий в файл MSBuild, например:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Install" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Install">
<Exec Command="powershell .\Install" />
</Target>
</Project>
Затем установите для командной строки после развертывания значение:
%WinDir%\Microsoft.NET\Framework64\v4.0.30319\MSBuild $(SolutionDir)\ProjectFiles\TestData\Install.msbuild