Udostępnij za pośrednictwem


Uruchamianie skryptów programu Windows PowerShell z poziomu plików projektów programu MSBuild

Autor: Jason Lee

W tym temacie opisano sposób uruchamiania skryptu Windows PowerShell w ramach procesu kompilacji i wdrażania. Skrypt można uruchomić lokalnie (innymi słowy na serwerze kompilacji) lub zdalnie, na przykład na docelowym serwerze internetowym lub serwerze bazy danych.

Istnieje wiele powodów, dla których warto uruchomić skrypt Windows PowerShell po wdrożeniu. Na przykład możesz chcieć:

  • Dodaj niestandardowe źródło zdarzeń do rejestru.
  • Wygeneruj katalog systemu plików do przekazywania.
  • Czyszczenie katalogów kompilacji.
  • Zapisywanie wpisów w niestandardowym pliku dziennika.
  • Wysyłanie wiadomości e-mail z zaproszeniem użytkowników do nowo aprowizowanej aplikacji internetowej.
  • Utwórz konta użytkowników z odpowiednimi uprawnieniami.
  • Konfigurowanie replikacji między wystąpieniami SQL Server.

W tym temacie pokazano, jak uruchamiać skrypty Windows PowerShell zarówno lokalnie, jak i zdalnie z niestandardowego obiektu docelowego w pliku projektu Microsoft Build Engine (MSBuild).

Ten temat stanowi część serii samouczków opartych na wymaganiach dotyczących wdrażania przedsiębiorstwa fikcyjnej firmy o nazwie Fabrikam, Inc. W tej serii samouczków użyto przykładowego rozwiązania — rozwiązania Contact Manager — do reprezentowania aplikacji internetowej o realistycznym poziomie złożoności, w tym aplikacji ASP.NET MVC 3, usługi Windows Communication Foundation (WCF) i projektu bazy danych.

Metoda wdrażania w centrum tych samouczków jest oparta na metodzie podzielonego pliku projektu opisanego w artykule Understanding the Project File (Opis pliku projektu), w którym proces kompilacji jest kontrolowany przez dwa pliki projektu — jeden zawierający instrukcje kompilacji, które mają zastosowanie do każdego środowiska docelowego, oraz jeden zawierający ustawienia kompilacji i wdrażania specyficzne dla środowiska. W czasie kompilacji plik projektu specyficzny dla środowiska jest scalony z plikiem projektu niezależnego od środowiska w celu utworzenia pełnego zestawu instrukcji kompilacji.

Omówienie zadań

Aby uruchomić skrypt Windows PowerShell w ramach zautomatyzowanego lub jednoetapowego procesu wdrażania, należy wykonać następujące zadania wysokiego poziomu:

  • Dodaj skrypt Windows PowerShell do rozwiązania i do kontroli źródła.
  • Utwórz polecenie, które wywołuje skrypt Windows PowerShell.
  • Ucieczka od wszelkich zastrzeżonych znaków XML w poleceniu.
  • Utwórz element docelowy w niestandardowym pliku projektu MSBuild i uruchom polecenie za pomocą zadania Exec .

W tym temacie pokazano, jak wykonać te procedury. W zadaniach i przewodnikach w tym temacie przyjęto założenie, że znasz już cele i właściwości programu MSBuild oraz wiesz, jak używać niestandardowego pliku projektu MSBuild do napędzania procesu kompilacji i wdrażania. Aby uzyskać więcej informacji, zobacz Understanding the Project File and Understanding the Build Process (Opis pliku projektu i opis procesu kompilacji).

Tworzenie i dodawanie skryptów Windows PowerShell

Zadania przedstawione w tym temacie używają przykładowego skryptu Windows PowerShell o nazwie LogDeploy.ps1, aby zilustrować sposób uruchamiania skryptów z programu MSBuild. Skrypt LogDeploy.ps1 zawiera prostą funkcję, która zapisuje wpis jednowierszowy do pliku dziennika:

function LogDeployment
{
  param([string]$filepath,[string]$deployDestination)
  $datetime = Get-Date
  $filetext = "Deployed package to " + $deployDestination + " on " + $datetime
  $filetext | Out-File -filepath $filepath -Append
}

LogDeployment $args[0] $args[1]

Skrypt LogDeploy.ps1 akceptuje dwa parametry. Pierwszy parametr reprezentuje pełną ścieżkę do pliku dziennika, do którego chcesz dodać wpis, a drugi parametr reprezentuje miejsce docelowe wdrożenia, które chcesz zarejestrować w pliku dziennika. Po uruchomieniu skryptu dodaje wiersz do pliku dziennika w tym formacie:

Deployed package to TESTWEB1 on 02/11/2012 09:28:18

Aby udostępnić skrypt LogDeploy.ps1 w programie MSBuild, należy wykonać następujące kroki:

  • Dodaj skrypt do kontroli źródła.
  • Dodaj skrypt do rozwiązania w programie Visual Studio 2010.

Nie musisz wdrażać skryptu z zawartością rozwiązania, niezależnie od tego, czy planujesz uruchomić skrypt na serwerze kompilacji, czy na komputerze zdalnym. Jedną z opcji jest dodanie skryptu do folderu rozwiązania. W przykładzie Programu Contact Manager, ponieważ chcesz użyć skryptu Windows PowerShell w ramach procesu wdrażania, warto dodać skrypt do folderu Publikuj rozwiązanie.

W przykładzie Programu Contact Manager, ponieważ chcesz użyć skryptu Windows PowerShell w ramach procesu wdrażania, warto dodać skrypt do folderu Publikuj rozwiązanie.

Zawartość folderów rozwiązania jest kopiowana do serwerów kompilacji jako materiału źródłowego. Jednak nie stanowią one żadnej części żadnych danych wyjściowych projektu.

Wykonywanie skryptu Windows PowerShell na serwerze kompilacji

W niektórych scenariuszach możesz uruchomić skrypty Windows PowerShell na komputerze, który kompiluje projekty. Można na przykład użyć skryptu Windows PowerShell do czyszczenia folderów kompilacji lub zapisywania wpisów w niestandardowym pliku dziennika.

Jeśli chodzi o składnię, uruchomienie skryptu Windows PowerShell z pliku projektu MSBuild jest takie samo jak uruchamianie skryptu Windows PowerShell z zwykłego wiersza polecenia. Musisz wywołać plik wykonywalny powershell.exe i użyć przełącznika -command , aby podać polecenia, które chcesz Windows PowerShell uruchomić. (W Windows PowerShell v2 można również użyć przełącznika –file). Polecenie powinno mieć następujący format:

powershell.exe –command "& { [Path to script] 'parameter1' 'parameter2' ... }"

Na przykład:

powershell.exe –command 
  "& { C:\LogDeploy.ps1 'C:\DeployLogs\log.txt' 'TESTWEB1' }"

Jeśli ścieżka do skryptu zawiera spacje, musisz ująć ścieżkę pliku w pojedyncze cudzysłowy poprzedzone znakiem ampersand. Nie można użyć cudzysłowów podwójnych, ponieważ zostały już użyte do ujęć polecenie:

powershell.exe –command 
  "& { &'C:\Path With Spaces\LogDeploy.ps1' 
        'C:\Path With Spaces\log.txt' 
        'TESTWEB1' }"

Podczas wywoływania tego polecenia z programu MSBuild należy wziąć pod uwagę kilka dodatkowych zagadnień. Najpierw należy dołączyć flagę –NonInteractive , aby upewnić się, że skrypt działa cicho. Następnie należy uwzględnić flagę –ExecutionPolicy z odpowiednią wartością argumentu. Określa zasady wykonywania, które Windows PowerShell będą stosowane do skryptu i umożliwiają zastąpienie domyślnych zasad wykonywania, które mogą uniemożliwić wykonywanie skryptu. Możesz wybrać spośród następujących wartości argumentów:

  • Wartość Bez ograniczeń pozwoli Windows PowerShell na wykonanie skryptu, niezależnie od tego, czy skrypt jest podpisany.
  • Wartość RemoteSigned umożliwi Windows PowerShell wykonywanie niepodpisanych skryptów utworzonych na komputerze lokalnym. Jednak skrypty, które zostały utworzone gdzie indziej, muszą być podpisane. (W praktyce bardzo mało prawdopodobne jest utworzenie skryptu Windows PowerShell lokalnie na serwerze kompilacji).
  • Wartość AllSigned pozwoli Windows PowerShell na wykonywanie tylko podpisanych skryptów.

Domyślne zasady wykonywania to Ograniczone, co uniemożliwia Windows PowerShell uruchamianie wszystkich plików skryptów.

Na koniec należy uciec od wszelkich zastrzeżonych znaków XML, które występują w Windows PowerShell polecenia:

  • Zastąp pojedyncze cudzysłowy '

  • Zastąp cudzysłowy podwójnym cudzysłowem &cudzysłowem;

  • Zastąp znaki ampersand &

  • Po wprowadzeniu tych zmian polecenie będzie wyglądać podobnie do następującego:

powershell.exe –NonInteractive –ExecutionPolicy Unrestricted 
               –command "& { &'[Path to script]' 
                        '[parameter1]' 
                        '[parameter2]' } "

W niestandardowym pliku projektu MSBuild możesz utworzyć nowy obiekt docelowy i użyć zadania Exec , aby uruchomić następujące polecenie:

<Target Name="WriteLogEntry" Condition=" '$(WriteLogEntry)'!='false' ">
  <PropertyGroup>
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
      %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
    </PowerShellExe>
    <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
      C:\Path With Spaces\LogDeploy.ps1
    </ScriptLocation>
    <LogFileLocation Condition=" '$(LogFileLocation)'=='' ">
      C:\Path With Spaces\ContactManagerDeployLog.txt
    </LogFileLocation>
  </PropertyGroup>
  <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted 
                 -command &quot;&amp; { 
                          &amp;&apos;$(ScriptLocation)&apos; 
                          &apos;$(LogFileLocation)&apos; 
                          &apos;$(MSDeployComputerName)&apos;} &quot;" />
</Target>

W tym przykładzie należy pamiętać, że:

  • Wszystkie zmienne, takie jak wartości parametrów i lokalizacja pliku wykonywalnego Windows PowerShell, są deklarowane jako właściwości programu MSBuild.
  • Warunki są uwzględniane w celu umożliwienia użytkownikom zastąpienia tych wartości z poziomu wiersza polecenia.
  • Właściwość MSDeployComputerName jest zadeklarowana w innym miejscu w pliku projektu.

Po wykonaniu tego obiektu docelowego w ramach procesu kompilacji Windows PowerShell uruchomi polecenie i napisze wpis dziennika do określonego pliku.

Wykonywanie skryptu Windows PowerShell na komputerze zdalnym

Windows PowerShell może uruchamiać skrypty na komputerach zdalnych za pośrednictwem funkcji Windows Remote Management (WinRM). W tym celu należy użyć polecenia cmdlet Invoke-Command . Umożliwia to wykonanie skryptu na co najmniej jednym komputerze zdalnym bez kopiowania skryptu na komputery zdalne. Wszystkie wyniki są zwracane na komputer lokalny, z którego został uruchomiony skrypt.

Uwaga

Przed użyciem polecenia cmdlet Invoke-Command do wykonywania skryptów Windows PowerShell na komputerze zdalnym należy skonfigurować odbiornik WinRM do akceptowania komunikatów zdalnych. Można to zrobić, uruchamiając polecenie winrm quickconfig na komputerze zdalnym. Aby uzyskać więcej informacji, zobacz Instalacja i konfiguracja zdalnego zarządzania systemem Windows.

W oknie Windows PowerShell użyjesz tej składni do uruchomienia skryptu LogDeploy.ps1 na komputerze zdalnym:

Invoke-Command –ComputerName 'REMOTESERVER1' 
               –ScriptBlock { &"C:\Path With Spaces\LogDeploy.ps1"
                               'C:\Path With Spaces\Log.txt'
                               'TESTWEB1' }

Uwaga

Istnieją różne inne sposoby używania polecenia Invoke-Command do uruchamiania pliku skryptu, ale takie podejście jest najprostsze, gdy trzeba podać wartości parametrów i zarządzać ścieżkami ze spacjami.

Po uruchomieniu tego polecenia z poziomu wiersza polecenia należy wywołać plik wykonywalny Windows PowerShell i użyć parametru -command, aby podać instrukcje:

powershell.exe –command 
  "& {Invoke-Command –ComputerName 'REMOTESERVER1' 
                     –ScriptBlock { &'C:\Path With Spaces\LogDeploy.ps1'
                                     'C:\Path With Spaces\Log.txt'
                                     'TESTWEB1' } "

Tak jak wcześniej, należy podać kilka dodatkowych przełączników i uniknąć wszelkich zastrzeżonych znaków XML podczas uruchamiania polecenia z programu MSBuild:

powershell.exe -NonInteractive -executionpolicy Unrestricted 
               -command &quot;&amp; Invoke-Command 
                 –ComputerName &apos;REMOTESERVER1&apos;
                 -ScriptBlock { &amp;&apos;C:\Path With Spaces\LogDeploy.ps1&apos; 
                                &apos; C:\Path With Spaces\Log.txt &apos;  
                                &apos;TESTWEB1&apos; } &quot;

Na koniec, tak jak wcześniej, możesz użyć zadania Exec w niestandardowym obiekcie docelowym MSBuild, aby wykonać polecenie:

<Target Name="WriteLogEntry" Condition=" '$(WriteLogEntry)'!='false' ">
  <PropertyGroup>
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
      %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
    </PowerShellExe>
    <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
      C:\Path With Spaces\LogDeploy.ps1
    </ScriptLocation>
    <LogFileLocation Condition=" '$(LogFileLocation)'=='' ">
      C:\Path With Spaces\ContactManagerDeployLog.txt
    </LogFileLocation>
  </PropertyGroup>
  <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted 
                 -command &quot;&amp; invoke-command -scriptblock { 
                          &amp;&apos;$(ScriptLocation)&apos; 
                          &apos;$(LogFileLocation)&apos;  
                          &apos;$(MSDeployComputerName)&apos;}
                          &quot;"/>  
</Target>

Po wykonaniu tego obiektu docelowego w ramach procesu kompilacji Windows PowerShell uruchomi skrypt na komputerze określonym w argumencie –computername.

Podsumowanie

W tym temacie opisano sposób uruchamiania skryptu Windows PowerShell z pliku projektu MSBuild. Możesz użyć tego podejścia do uruchamiania skryptu Windows PowerShell lokalnie lub na komputerze zdalnym w ramach zautomatyzowanego lub jednoetapowego procesu kompilacji i wdrażania.

Dalsze informacje

Aby uzyskać wskazówki dotyczące podpisywania skryptów Windows PowerShell i zarządzania zasadami wykonywania, zobacz Uruchamianie skryptów Windows PowerShell. Aby uzyskać wskazówki dotyczące uruchamiania poleceń Windows PowerShell z komputera zdalnego, zobacz Uruchamianie poleceń zdalnych.

Aby uzyskać więcej informacji na temat używania niestandardowych plików projektu MSBuild do kontrolowania procesu wdrażania, zobacz Understanding the Project File and Understanding the Build Process (Opis pliku projektu i Opis procesu kompilacji).