我编写了一个脚本,将一些测试数据插入到文档库中。我打算将它用作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
,部署后命令也会失败。
更新:找到解决方案
我似乎遇到了类似问题:
我无法使用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
答案 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"