Вызовите скрипт powershell в пост-сборки с параметрами - PullRequest
7 голосов
/ 15 февраля 2011

Я пытаюсь заставить Powershell запускать мой PS-скрипт в пост-сборке - но почему-то он не работает так, как должен:

Следующая команда в Post-Build:

C:\WINDOWS\system32\windowspowershell\1.0\powershell.exe
  -Command "& $(MSBuildProjectDirectory)\CreateSite.ps1 'auto'"

(вставленный разрыв строки для лучшего чтения)

Команда успешно выполняет скрипт powershell, но она не может выполнить команды внутри (Вывод из сборки): Rund команда пост-сборки:

Add-PSSnapin : No snap-ins have been registered for Windows PowerShell version 2
At C:\path\CreateSite.ps1:4 char:
38
+ Add-PsSnapin <<<< Microsoft.SharePoint.PowerShell}
+ CategoryInfo : InvalidArgument: (Microsoft.SharePoint.PowerShell:String) [Add-PSSnapin], PSArgumentException
+ FullyQualifiedErrorId : AddPSSnapInRead,Microsoft.PowerShell.Commands.AddPSSnapinCommand

И после этого возникает много ошибок, поскольку для всех последующих команд требуется оснастка Sharepoint.

  • При запуске powershell C: \ path \ CreateSite.ps1 auto из cmd - все работает.
  • При открытии powershell.exe и запуске C: \ path \ CreateSite.ps1 auto - все работает.
  • При щелчке правой кнопкой мыши CreateSite.ps1 -> запуск с powershell - все работает.

Соответствующая строка в скрипте просто Add-PsSnapin Microsoft.SharePoint.PowerShell.

Как мне просто запустить скрипт darn (и заставить его включить PSSnapIn), передав ему параметр в Visual Studio после сборки?

Ответы [ 5 ]

16 голосов
/ 07 марта 2012

(Эта тема не нова, но я пришел сюда от Google, поэтому я подумал, что поделиться найденным решением будет интересно другим)

Я попытался изменить путь к powershell.exe на "% WINDIR% \ SysNative \ WindowsPowerShell \ v1.0 \ powershell.exe "и все работало идеально.64-разрядная версия вызывается из события Post Build и успешно добавляет оснастку SharePoint.

Кредиты к этой статье: http://msdn.microsoft.com/en-us/library/ff798298.aspx, «Использование сценариев Windows PowerShell для автоматизации задач в Visual Studio».

6 голосов
/ 16 февраля 2011

Из-за виртуализации файловой системы вы не можете указать путь к 64-разрядной версии PowerShell из 32-разрядного процесса (т. Е. Visual Studio, в которой размещается механизм msbuild). Один из хакерских способов обойти это - создать 64-разрядную программу запуска, которая будет работать как 64-разрядная и запустить 64-разрядную версию PowerShell. Вот простая программа на C #, которая сделает это:

using System;
using System.Diagnostics;

class App
{
  static int Main(string[] args)
  {
    Process process = Process.Start("PowerShell.exe", String.Join(" ", args));
    process.WaitForExit();
    return process.ExitCode;
  }
}

Обязательно скомпилируйте это как 64-битное, вот так:

csc .\PowerShell64.cs /platform:x64

Затем из вашего события после сборки запустите этот модуль запуска, передав ему параметры, с которыми вы хотите вызвать 64-битный PowerShell. Кроме того, в PowerShell 2.0 я бы порекомендовал использовать параметр File для выполнения скрипта, например ::10000

c:\path\PowerShell64.exe -File "$(MSBuildProjectDirectory)\CreateSite.ps1" auto

Тем не менее, безусловно, должен быть какой-то другой способ (утилита), который запускает exes из 64-битного процесса.

1 голос
/ 31 марта 2015

добавить cmd-файл (например, run-script.cmd) со следующим содержимым:


    @echo off
    set pspath=%windir%\Sysnative\WindowsPowerShell\v1.0
    if not exist %pspath%\powershell.exe set pspath=%windir%\System32\WindowsPowerShell\v1.0
    %pspath%\powershell.exe -ExecutionPolicy RemoteSigned %*

и вызвать его из события сборки следующим образом:


    $(SolutionDir)scripts\run-script.cmd $(SolutionDir)scripts\restore-default-file.ps1 -source $(ProjectDir)App_Data\Configs\Mip.Security.Sample.config -destination $(ProjectDir)App_Data\Configs\Mip.Security.config

1 голос
/ 03 января 2012

Несколько лучший вариант перенаправления вывода:

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;

namespace ConsoleApplication1
{
    class App
    {
        static int Main(string[] args)
        {
            Console.WriteLine("sh64 args: " + string.Join(", ", args));
            var start = new ProcessStartInfo
                {
                    FileName = args.First(),
                    Arguments = string.Join(" ", args.Skip(1).ToArray()),
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    RedirectStandardInput = false,
                    CreateNoWindow = true
                };

            using (var process = Process.Start(start))
            {
                while (!process.HasExited)
                {
                    using (var reader = process.StandardOutput)
                        Drain(reader, false);
                    using (var reader = process.StandardError)
                        Drain(reader, true);
                }
                process.WaitForExit();
                return process.ExitCode;
            }
        }

        static void Drain(TextReader reader, bool error)
        {
            ColourizeError(error, () =>
                {
                    var buf = new char[256];
                    int read;
                    while ((read = reader.Read(buf, 0, buf.Length)) != 0)
                        Console.Write(new string(buf, 0, read));
                });
        }

        static void ColourizeError(bool error, Action a)
        {
            var prev = Console.ForegroundColor;
            Console.ForegroundColor = error ? ConsoleColor.Red : ConsoleColor.White;
            var mre = new ManualResetEventSlim(false);
            try
            {
                a();
            }
            finally
            {
                Console.ForegroundColor = prev;
                mre.Set(); // runs on GC thread on servers and is reentrant/interleaved concurrency in workstations!
            }
            mre.Wait();
        }
    }
}

Позвонить с sh64 powershell -File ./buildscripts/deploy.ps1 -Ex RemoteSigned

1 голос
/ 15 февраля 2011

Когда вы запускаете сценарий напрямую, вы, вероятно, используете 32-разрядную версию PowerShell, а в своем сценарии msbuild - 64-разрядную или наоборот.Также посмотрите на сообщение об ошибке: : «Для Windows PowerShell версии 2 не было зарегистрировано оснасток». .

...