作为Visual Studio部署后命令运行时,SharePoint脚本失败

时间:2010-10-12 10:07:38

标签: sharepoint visual-studio-2010 deployment powershell sharepoint-2010

我编写了一个脚本,将一些测试数据插入到文档库中。我打算将它用作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

但是,当我在Visual Studio的SharePoint项目属性中使用与部署后命令行完全相同的命令时,它不起作用:

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

我无法使用32位客户端访问64位SharePoint API。由于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

4 个答案:

答案 0 :(得分:5)

使用

%WINDIR%\ SysNative \ WindowsPowerShell \ V1.0 \ powershell.exe

使用%WINDIR%\ SysNative的虚拟路径而不是实际路径非常重要 C:\ Windows \ System32的路径。原因是Visual Studio 2010是32位的 需要调用64位版本的powershell.exe才能成功加载的应用程序 Microsoft.SharePoint.Powershell管理单元。

(c)“Microsoft SharePoint 2010内部”,Microsoft Press,2011年3月

答案 1 :(得分:2)

我有同样的情况,我需要Post Deployment powershell脚本为我的本地实例上的列表创建虚拟数据。我尝试了几种其他方法,甚至使用MSBuild与.msbuild文件,如上所述,但我不能所有的变量,不得不用路径和网址硬编码文件,这不是我想要的。

我终于想出了一种显式调用64位powershell.exe的方法

我知道64位文件必须在硬盘上。我知道WinSXS文件夹包含所有文件。所以在C:\ Windows \ winsxs文件夹中快速搜索powershell.exe我有两个文件,所以我抓住了amd64文件夹中的一个路径。

这就是我在后期部署选项中的命令

C:\Windows\winsxs\amd64_microsoft-windows-powershell-exe_31bf3856ad364e35_6.1.7600.16385_none_c50af05b1be3aa2b\powershell.exe -command "&{$(ProjectDir)PowerShell\dataload.ps1 -xmlPath "$(ProjectDir)PowerShell\dataload.xml" -webUrl "$(SharePointSiteUrl)"}"

我希望这将有助于将来。

答案 2 :(得分:1)

Visual Studio是一个32位应用程序,因此在64位Windows中,它在模拟的32位环境中运行。

奇怪的是,32位环境被称为“WoW64”(当32位Windows为16位应用程序执行此操作时,它被称为“WoW16”。“WoW”部分意味着“Windows上的Windows”。

同样奇怪的是,“System32”没有成为64位Windows的“System64”。 “32”来自16位 - > 32位转换,以区别于“系统”。无论如何,这是您的遗产/兼容性。

在WoW64中,一切看起来都像是32位Windows。

例如,c:\windows\system32只指向c:\windows\syswow64。 32位应用程序无法(轻松)达到任何64位。

可以使用 PowerShell远程处理从32位环境中获取64位PowerShell会话。

PS>gci env:PROCESSOR_ARCH*

Name                           Value
----                           -----
PROCESSOR_ARCHITECTURE         x86
PROCESSOR_ARCHITEW6432         AMD64


PS>Invoke-Command -ConfigurationName Microsoft.PowerShell -ComputerName LOCALHOST {  gci env:PROCESSOR_ARCH* }

Name                           Value                                        PSComputerName
----                           -----                                        --------------
PROCESSOR_ARCHITECTURE         AMD64                                        localhost

答案 3 :(得分:0)

我作为一个部署后命令成功地做到了这一点:

%comspec% /c powershell -File "c:\foo\bar.ps1"