Bagikan melalui


Menjalankan Skrip Windows PowerShell dari MSBuild Project Files

oleh Jason Lee

Topik ini menjelaskan cara menjalankan skrip Windows PowerShell sebagai bagian dari proses build dan penyebaran. Anda dapat menjalankan skrip secara lokal (dengan kata lain, di server build) atau dari jarak jauh, seperti di server web tujuan atau server database.

Ada banyak alasan mengapa Anda mungkin ingin menjalankan skrip Windows PowerShell pasca-penyebaran. Misalnya, Anda mungkin perlu:

  • Tambahkan sumber peristiwa kustom ke registri.
  • Buat direktori sistem file untuk unggahan.
  • Bersihkan direktori build.
  • Tulis entri ke file log kustom.
  • Kirim email yang mengundang pengguna ke aplikasi web yang baru disediakan.
  • Buat akun pengguna dengan izin yang sesuai.
  • Mengonfigurasi replikasi antara instans SQL Server.

Topik ini akan menunjukkan kepada Anda cara menjalankan skrip Windows PowerShell baik secara lokal maupun jarak jauh dari target kustom dalam file proyek Microsoft Build Engine (MSBuild).

Topik ini merupakan bagian dari serangkaian tutorial berdasarkan persyaratan penyebaran perusahaan dari perusahaan fiktif bernama Fabrikam, Inc. Seri tutorial ini menggunakan solusi sampel— solusi Contact Manager—untuk mewakili aplikasi web dengan tingkat kompleksitas yang realistis, termasuk aplikasi ASP.NET MVC 3, layanan Windows Communication Foundation (WCF), dan proyek database.

Metode penyebaran di jantung tutorial ini didasarkan pada pendekatan file proyek terpisah yang dijelaskan dalam Memahami File Proyek, di mana proses build dikendalikan oleh dua file proyek—satu berisi instruksi build yang berlaku untuk setiap lingkungan tujuan, dan satu berisi pengaturan build dan penyebaran khusus lingkungan. Pada waktu build, file proyek khusus lingkungan digabungkan ke dalam file proyek agnostik lingkungan untuk membentuk serangkaian instruksi build lengkap.

Gambaran Umum Tugas

Untuk menjalankan skrip Windows PowerShell sebagai bagian dari proses penyebaran otomatis atau satu langkah, Anda harus menyelesaikan tugas tingkat tinggi ini:

  • Tambahkan skrip Windows PowerShell ke solusi Anda dan ke kontrol sumber.
  • Buat perintah yang memanggil skrip Windows PowerShell Anda.
  • Lolos dari karakter XML yang dicadangkan dalam perintah Anda.
  • Buat target dalam file proyek MSBuild kustom Anda dan gunakan tugas Exec untuk menjalankan perintah Anda.

Topik ini akan menunjukkan kepada Anda cara melakukan prosedur ini. Tugas dan panduan dalam topik ini mengasumsikan bahwa Anda sudah terbiasa dengan target dan properti MSBuild, dan bahwa Anda memahami cara menggunakan file proyek MSBuild kustom untuk mendorong proses build dan penyebaran. Untuk informasi selengkapnya, lihat Memahami File Proyek dan Memahami Proses Build.

Membuat dan Menambahkan Skrip Windows PowerShell

Tugas dalam topik ini menggunakan contoh skrip Windows PowerShell bernama LogDeploy.ps1 untuk mengilustrasikan cara menjalankan skrip dari MSBuild. Skrip LogDeploy.ps1 berisi fungsi sederhana yang menulis entri baris tunggal ke file log:

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]

Skrip LogDeploy.ps1 menerima dua parameter. Parameter pertama mewakili jalur lengkap ke file log yang ingin Anda tambahkan entrinya, dan parameter kedua mewakili tujuan penyebaran yang ingin Anda rekam dalam file log. Saat Anda menjalankan skrip, skrip menambahkan baris ke file log dalam format ini:

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

Untuk membuat skrip LogDeploy.ps1 tersedia untuk MSBuild, Anda perlu:

  • Tambahkan skrip ke kontrol sumber.
  • Tambahkan skrip ke solusi Anda di Visual Studio 2010.

Anda tidak perlu menyebarkan skrip dengan konten solusi Anda, terlepas dari apakah Anda berencana untuk menjalankan skrip di server build atau di komputer jarak jauh. Salah satu opsinya adalah menambahkan skrip ke folder solusi. Dalam contoh Contact Manager, karena Anda ingin menggunakan skrip Windows PowerShell sebagai bagian dari proses penyebaran, masuk akal untuk menambahkan skrip ke folder terbitkan solusi.

Dalam contoh Contact Manager, karena Anda ingin menggunakan skrip Windows PowerShell sebagai bagian dari proses penyebaran, masuk akal untuk menambahkan skrip ke folder terbitkan solusi.

Konten folder solusi disalin untuk membangun server sebagai bahan sumber. Namun, mereka tidak membentuk bagian dari output proyek apa pun.

Menjalankan Skrip Windows PowerShell di Server Build

Dalam beberapa skenario, Anda mungkin ingin menjalankan skrip Windows PowerShell di komputer yang membangun proyek Anda. Misalnya, Anda dapat menggunakan skrip Windows PowerShell untuk membersihkan folder build atau menulis entri ke file log kustom.

Dalam hal sintaksis, menjalankan skrip Windows PowerShell dari file proyek MSBuild sama dengan menjalankan skrip Windows PowerShell dari prompt perintah biasa. Anda perlu memanggil powershell.exe yang dapat dieksekusi dan menggunakan sakelar perintah untuk menyediakan perintah yang Anda inginkan Windows PowerShell jalankan. (Dalam Windows PowerShell v2, Anda juga dapat menggunakan sakelar –file). Perintah harus mengambil format ini:

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

Contohnya:

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

Jika jalur ke skrip Anda menyertakan spasi, Anda perlu mengapit jalur file dalam tanda kutip tunggal yang didahului oleh ampersand. Anda tidak dapat menggunakan tanda kutip ganda, karena Anda telah menggunakannya untuk mengapit perintah:

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

Ada beberapa pertimbangan tambahan ketika Anda memanggil perintah ini dari MSBuild. Pertama, Anda harus menyertakan bendera –NonInteractive untuk memastikan bahwa skrip dijalankan dengan diam-diam. Selanjutnya, Anda harus menyertakan bendera –ExecutionPolicy dengan nilai argumen yang sesuai. Ini menentukan kebijakan eksekusi yang akan diterapkan Windows PowerShell ke skrip Anda dan memungkinkan Anda untuk mengambil alih kebijakan eksekusi default, yang dapat mencegah eksekusi skrip Anda. Anda dapat memilih dari nilai argumen ini:

  • Nilai Tidak Terbatas akan memungkinkan Windows PowerShell untuk menjalankan skrip Anda, terlepas dari apakah skrip ditandatangani.
  • Nilai RemoteSigned akan memungkinkan Windows PowerShell untuk menjalankan skrip yang tidak ditandatangani yang dibuat pada komputer lokal. Namun, skrip yang dibuat di tempat lain harus ditandatangani. (Dalam praktiknya, Anda sangat tidak mungkin membuat skrip Windows PowerShell secara lokal di server build).
  • Nilai AllSigned akan memungkinkan Windows PowerShell untuk menjalankan skrip yang ditandatangani saja.

Kebijakan eksekusi default dibatasi, yang mencegah Windows PowerShell menjalankan file skrip apa pun.

Terakhir, Anda perlu menghindari karakter XML yang dipesan yang terjadi dalam perintah Windows PowerShell Anda:

  • Ganti tanda kutip tunggal dengan apos&;

  • Ganti tanda kutip ganda dengan kutipan&;

  • Ganti ampersand dengan &

  • Saat Anda membuat perubahan ini, perintah Anda akan menyerupai ini:

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

Dalam file proyek MSBuild kustom, Anda dapat membuat target baru dan menggunakan tugas Exec untuk menjalankan perintah ini:

<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>

Dalam contoh ini, perhatikan bahwa:

  • Variabel apa pun, seperti nilai parameter dan lokasi Windows PowerShell dapat dieksekusi, dinyatakan sebagai properti MSBuild.
  • Kondisi disertakan untuk memungkinkan pengguna mengambil alih nilai-nilai ini dari baris perintah.
  • Properti MSDeployComputerName dinyatakan di tempat lain dalam file proyek.

Ketika Anda menjalankan target ini sebagai bagian dari proses build Anda, Windows PowerShell akan menjalankan perintah Anda dan menulis entri log ke file yang Anda tentukan.

Menjalankan Skrip Windows PowerShell di Komputer Jarak Jauh

Windows PowerShell mampu menjalankan skrip pada komputer jarak jauh melalui Windows Remote Management (WinRM). Untuk melakukan ini, Anda perlu menggunakan cmdlet Invoke-Command . Ini memungkinkan Anda menjalankan skrip terhadap satu atau beberapa komputer jarak jauh tanpa menyalin skrip ke komputer jarak jauh. Hasil apa pun dikembalikan ke komputer lokal tempat Anda menjalankan skrip.

Catatan

Sebelum Anda menggunakan cmdlet Invoke-Command untuk menjalankan skrip Windows PowerShell di komputer jarak jauh, Anda perlu mengonfigurasi pendengar WinRM untuk menerima pesan jarak jauh. Anda dapat melakukan ini dengan menjalankan perintah winrm quickconfig pada komputer jarak jauh. Untuk informasi selengkapnya, lihat Penginstalan dan Konfigurasi untuk Manajemen Jarak Jauh Windows.

Dari jendela Windows PowerShell, Anda akan menggunakan sintaks ini untuk menjalankan skrip LogDeploy.ps1 di komputer jarak jauh:

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

Catatan

Ada berbagai cara lain untuk menggunakan Invoke-Command untuk menjalankan file skrip, tetapi pendekatan ini adalah yang paling mudah ketika Anda perlu memberikan nilai parameter dan mengelola jalur dengan spasi.

Saat Anda menjalankan ini dari prompt perintah, Anda perlu memanggil Windows PowerShell yang dapat dieksekusi dan menggunakan parameter -command untuk memberikan instruksi Anda:

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

Seperti sebelumnya, Anda perlu menyediakan beberapa sakelar tambahan dan menghindari karakter XML yang dipesan saat Anda menjalankan perintah dari 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;

Terakhir, seperti sebelumnya, Anda dapat menggunakan tugas Exec dalam target MSBuild kustom untuk menjalankan perintah Anda:

<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>

Ketika Anda menjalankan target ini sebagai bagian dari proses build Anda, Windows PowerShell akan menjalankan skrip Anda di komputer yang Anda tentukan dalam argumen -computername.

Kesimpulan

Topik ini menjelaskan cara menjalankan skrip Windows PowerShell dari file proyek MSBuild. Anda dapat menggunakan pendekatan ini untuk menjalankan skrip Windows PowerShell, baik secara lokal maupun di komputer jarak jauh, sebagai bagian dari proses build dan penyebaran langkah tunggal atau otomatis.

Bacaan lebih lanjut

Untuk panduan tentang menandatangani skrip Windows PowerShell dan mengelola kebijakan eksekusi, lihat Menjalankan Skrip Windows PowerShell. Untuk panduan tentang menjalankan perintah Windows PowerShell dari komputer jarak jauh, lihat Menjalankan Perintah Jarak Jauh.

Untuk informasi selengkapnya tentang menggunakan file proyek MSBuild kustom untuk mengontrol proses penyebaran, lihat Memahami File Proyek dan Memahami Proses Build.