I wrote a script that inserts some test data into a document library. I intend to use it as a post-deployment step in Visual Studio 2010, so the library will not be empty after retraction and deployment.
Relevant parts of the script:
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}
It works great at startup, as follows from the command line, even immediately after redeploying Visual Studio:
powershell \ source \ ProjectFiles \ TestData \ Install.ps1
However, this does not work when I use the same command as on the command line after deployment in the properties of a SharePoint project in 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
Interestingly, I can reproduce the error on the command line if I run:
c: \ windows \ Syswow64 \ WindowsPowerShell \ v1.0 \ powershell \ source \ ProjectFiles \ TestData \ Install.ps1
However, the command after deployment fails even if I explicitly run \windows\System32\WindowsPowerShell\v1.0\powershell and \windows\Syswow64\WindowsPowerShell\v1.0\powershell .
Update: solution found
It seems I have a similar problem with the one discussed here:
http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/faa25866-330b-4e60-8eee-bd72dc9fa5be
I cannot access the 64-bit SharePoint API using 32-bit clients. Because Visual Studio is 32-bit, the post-deployment action will be executed in a 32-bit process and will fail. However, there is 64-bit MSBuild. If we let him run the PowerShell script, everything will be fine.
Wrap the script in an MSBuild file, for example:
<?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>
Then set the command line after deployment to:
% WinDir% \ Microsoft.NET \ Framework64 \ v4.0.30319 \ MSBuild $ (SolutionDir) \ ProjectFiles \ TestData \ Install.msbuild