Сценарий SharePoint завершается ошибкой при запуске в качестве команды после развертывания Visual Studio - PullRequest
7 голосов
/ 12 октября 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

Однако это не работает, когда я использую ту же команду, что и командная строка после развертывания, в свойствах проекта 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

Ответы [ 4 ]

5 голосов
/ 27 апреля 2011

Использовать

% 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

2 голосов
/ 10 февраля 2011

У меня была такая же ситуация, мне понадобился сценарий PowerShell после развертывания, чтобы создать фиктивные данные для списков в моем локальном экземпляре.Я попробовал несколько других способов, даже используя MSBuild с файлом .msbuild, как предложено выше, но я не смог все переменные и мне пришлось жестко закодировать файл с помощью path и url, это не то, что я хотел.

Я наконец-то нашел способ явно вызывать 64-битный powershell.exe

Я знаю, что 64-битный файл должен быть там на жестком диске.Я знаю, что в папке WinSXS есть все файлы.Так что быстрый поиск powershell.exe в папке C: \ Windows \ winsxs, я получил два файла, поэтому я нашел путь к одному в папке 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)"}"

Надеюсь, это поможет кому-то в будущем.

1 голос
/ 12 октября 2010

Visual Studio - это 32-битное приложение, поэтому в 64-битной Windows оно работает в симулированной 32-битной среде.

Как ни странно, 32-битная среда называется "WoW64 "(когда 32-битная Windows делала это для 16-битных приложений, она называлась" WoW16 ". Часть" WoW "означает" Windows в Windows ".

Странно также, что" System32 "неСтановится «System64» с 64-битной Windows. «32» - это переход от 16-битной -> 32-битной, чтобы отличать от «System». Что бы это ни было, это наследие / совместимость для вас.

В WoW64 все выглядит как 32-битная Windows.

Например, c:\windows\system32 просто указывает на c:\windows\syswow64. 32-битные приложения не могут (легко) достичь чего-либо 64-bit.

Можно использовать PowerShell Remoting для получения 64-разрядного сеанса PowerShell из 32-разрядной среды.

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
0 голосов
/ 26 июня 2012

Я успешно выполнил это как команду после развертывания:

%comspec% /c powershell -File "c:\foo\bar.ps1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...