Aracılığıyla paylaş


MSBuild Proje Dosyalarından Windows PowerShell Betikleri Çalıştırma

tarafından Jason Lee

Bu konuda, derleme ve dağıtım işleminin bir parçası olarak bir Windows PowerShell betiğinin nasıl çalıştırıldığı açıklanır. Bir betiği yerel olarak (başka bir deyişle, derleme sunucusunda) veya hedef web sunucusunda veya veritabanı sunucusunda olduğu gibi uzaktan çalıştırabilirsiniz.

Dağıtım sonrası Windows PowerShell betiğini çalıştırmak istemenin birçok nedeni vardır. Örneğin, şunları yapmak isteyebilirsiniz:

  • Kayıt defterine özel bir olay kaynağı ekleyin.
  • Karşıya yüklemeler için bir dosya sistemi dizini oluşturun.
  • Derleme dizinlerini temizleyin.
  • Özel bir günlük dosyasına girdiler yazın.
  • Kullanıcıları yeni sağlanan bir web uygulamasına davet eden e-postalar gönderin.
  • Uygun izinlere sahip kullanıcı hesapları oluşturun.
  • SQL Server örnekleri arasında çoğaltmayı yapılandırın.

Bu konu başlığı altında, Microsoft Build Engine (MSBuild) proje dosyasındaki özel bir hedeften hem yerel hem de uzaktan Windows PowerShell betiklerin nasıl çalıştırılacağı gösterilir.

Bu konu, Fabrikam, Inc adlı kurgusal bir şirketin kurumsal dağıtım gereksinimlerini temel alan bir dizi öğreticinin bir parçasını oluşturur. Bu öğretici serisinde, ASP.NET MVC 3 uygulaması, Windows Communication Foundation (WCF) hizmeti ve veritabanı projesi dahil olmak üzere gerçekçi bir karmaşıklık düzeyine sahip bir web uygulamasını temsil etmek için örnek bir çözüm (Contact Manager çözümü) kullanılır.

Bu öğreticilerin temelindeki dağıtım yöntemi, derleme işleminin iki proje dosyası tarafından denetlendiği Proje Dosyasını Anlama bölümünde açıklanan bölünmüş proje dosyası yaklaşımını temel alır: biri her hedef ortama uygulanan derleme yönergelerini, diğeri de ortama özgü derleme ve dağıtım ayarlarını içerir. Derleme zamanında, ortama özgü proje dosyası, tam bir derleme yönergeleri kümesi oluşturmak için ortama bağımsız proje dosyasıyla birleştirilir.

Göreve Genel Bakış

Otomatik veya tek adımlı dağıtım işleminin bir parçası olarak Windows PowerShell betiği çalıştırmak için şu üst düzey görevleri tamamlamanız gerekir:

  • Windows PowerShell betiğini çözümünüze ve kaynak denetimine ekleyin.
  • Windows PowerShell betiğinizi çağıran bir komut oluşturun.
  • Komutunuzdaki ayrılmış XML karakterlerini kaçış olarak kullanın.
  • Özel MSBuild proje dosyanızda bir hedef oluşturun ve komutunu çalıştırmak için Exec görevini kullanın.

Bu konu başlığında, bu yordamların nasıl gerçekleştirileceği gösterilir. Bu konudaki görevler ve izlenecek yollar, MSBuild hedefleri ve özellikleri hakkında zaten bilgi sahibi olduğunuzu ve derleme ve dağıtım işlemini yönlendirmek için özel bir MSBuild proje dosyasının nasıl kullanılacağını anladığınızı varsayar. Daha fazla bilgi için bkz. Proje Dosyasını Anlama ve Derleme sürecini anlama.

Windows PowerShell Betikleri Oluşturma ve Ekleme

Bu konudaki görevler, MSBuild'den betik çalıştırmayı göstermek içinLogDeploy.ps1adlı örnek bir Windows PowerShell betiği kullanır. LogDeploy.ps1 betiği, günlük dosyasına tek satırlık bir giriş yazan basit bir işlev içerir:

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]

LogDeploy.ps1 betiği iki parametre kabul eder. İlk parametre, giriş eklemek istediğiniz günlük dosyasının tam yolunu, ikinci parametre ise günlük dosyasına kaydetmek istediğiniz dağıtım hedefini temsil eder. Betiği çalıştırdığınızda, günlük dosyasına şu biçimde bir satır ekler:

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

LogDeploy.ps1 betiğini MSBuild'in kullanımına açmak için şunları yapmanız gerekir:

  • Betiği kaynak denetimine ekleyin.
  • Visual Studio 2010'da betiği çözümünüze ekleyin.

Betiği derleme sunucusunda veya uzak bir bilgisayarda çalıştırmayı planlayıp planlamadığınıza bakılmaksızın, betiği çözüm içeriğinizle dağıtmanız gerekmez. Bir seçenek, betiği bir çözüm klasörüne eklemektir. Contact Manager örneğinde, Windows PowerShell betiğini dağıtım işleminin bir parçası olarak kullanmak istediğinizden, betiği Çözümü yayımla klasörüne eklemek mantıklıdır.

Contact Manager örneğinde, Windows PowerShell betiğini dağıtım işleminin bir parçası olarak kullanmak istediğinizden, betiği Çözümü yayımla klasörüne eklemek mantıklıdır.

Çözüm klasörlerinin içeriği, kaynak malzeme olarak sunucu oluşturmak için kopyalanır. Ancak, herhangi bir proje çıkışının bir parçasını oluşturmaz.

Derleme Sunucusunda Windows PowerShell Betiği Yürütme

Bazı senaryolarda, projelerinizi oluşturan bilgisayarda Windows PowerShell betikleri çalıştırmak isteyebilirsiniz. Örneğin, derleme klasörlerini temizlemek veya özel bir günlük dosyasına girdi yazmak için bir Windows PowerShell betiği kullanabilirsiniz.

Söz dizimi açısından, MSBuild proje dosyasından Windows PowerShell betiği çalıştırmak, normal bir komut isteminden Windows PowerShell betiği çalıştırmakla aynıdır. powershell.exe yürütülebilir dosyasını çağırmanız ve Windows PowerShell çalıştırmak istediğiniz komutları sağlamak için –command anahtarını kullanmanız gerekir. (Windows PowerShell v2'de –file anahtarını da kullanabilirsiniz). Komut şu biçimde olmalıdır:

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

Örnek:

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

Betiğinizin yolu boşluk içeriyorsa, dosya yolunu bir ve işaretinden önce gelen tek tırnak içine almanız gerekir. Komutu içine almak için zaten kullandığınız için çift tırnak kullanamazsınız:

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

Bu komutu MSBuild'den çağırdığınızda dikkate alınması gereken birkaç ek nokta vardır. İlk olarak, betiğin sessizce yürütülmesini sağlamak için –NonInteractive bayrağını eklemelisiniz. Ardından, uygun bir bağımsız değişken değerine sahip –ExecutionPolicy bayrağını eklemelisiniz. Bu, Windows PowerShell betiğinize uygulayacağı yürütme ilkesini belirtir ve betiğinizin yürütülmesini engelleyebilecek varsayılan yürütme ilkesini geçersiz kılmanıza olanak tanır. Bu bağımsız değişken değerleri arasından seçim yapabilirsiniz:

  • Unrestricted değeri, Windows PowerShell betiğinizin imzalanmış olup olmadığına bakılmaksızın betiğinizi yürütmesine olanak sağlar.
  • RemoteSigned değeri, Windows PowerShell yerel makinede oluşturulan imzalanmamış betikleri yürütmesine izin verir. Ancak, başka bir yerde oluşturulan betiklerin imzalanması gerekir. (Uygulamada, derleme sunucusunda yerel olarak bir Windows PowerShell betiği oluşturmuş olma olasılığınız çok düşüktür).
  • AllSigned değeri, Windows PowerShell yalnızca imzalı betikleri yürütmesine izin verir.

Varsayılan yürütme ilkesi Kısıtlı'dır ve bu da Windows PowerShell betik dosyalarını çalıştırmasını engeller.

Son olarak, Windows PowerShell komutunuzda gerçekleşen tüm ayrılmış XML karakterlerini kaçış olarak kullanmanız gerekir:

  • Tek tırnakları &pos ile değiştirin;

  • Çift tırnakları &bölümle değiştirin;

  • Ve ve öğelerini &

  • Bu değişiklikleri yaptığınızda komutunuz şuna benzer olacaktır:

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

Özel MSBuild proje dosyanızda yeni bir hedef oluşturabilir ve Exec görevini kullanarak şu komutu çalıştırabilirsiniz:

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

Bu örnekte şunları unutmayın:

  • Parametre değerleri ve Windows PowerShell yürütülebilir dosyasının konumu gibi tüm değişkenler MSBuild özellikleri olarak bildirilir.
  • Kullanıcıların komut satırından bu değerleri geçersiz kılabilmesi için koşullar dahil edilir.
  • MSDeployComputerName özelliği proje dosyasının başka bir yerinde bildirilir.

Bu hedefi derleme işleminizin bir parçası olarak yürüttüğünüzde, Windows PowerShell komutunuzu çalıştırır ve belirttiğiniz dosyaya bir günlük girdisi yazar.

Uzak Bilgisayarda Windows PowerShell Betiği Yürütme

Windows PowerShell, Windows Uzaktan Yönetimi (WinRM) aracılığıyla uzak bilgisayarlarda betik çalıştırabilme özelliğine sahiptir. Bunu yapmak için Invoke-Command cmdlet'ini kullanmanız gerekir. Bu, betiği uzak bilgisayarlara kopyalamadan bir veya daha fazla uzak bilgisayarda betiğinizi yürütmenizi sağlar. Betiği çalıştırdığınız yerel bilgisayara tüm sonuçlar döndürülür.

Not

Uzak bir bilgisayarda Windows PowerShell betikleri yürütmek için Invoke-Command cmdlet'ini kullanmadan önce, uzak iletileri kabul etmek için bir WinRM dinleyicisi yapılandırmanız gerekir. Bunu, uzak bilgisayarda winrm quickconfig komutunu çalıştırarak yapabilirsiniz. Daha fazla bilgi için bkz. Windows Uzaktan Yönetimi için Yükleme ve Yapılandırma.

Windows PowerShell penceresinden, uzak bir bilgisayarda LogDeploy.ps1 betiğini çalıştırmak için bu söz dizimini kullanırsınız:

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

Not

Bir betik dosyasını çalıştırmak için Invoke-Command kullanmanın farklı yolları da vardır, ancak parametre değerleri sağlamanız ve yolları boşluklarla yönetmeniz gerektiğinde bu yaklaşım en kolay yaklaşımdır.

Bunu bir komut isteminden çalıştırdığınızda, Windows PowerShell yürütülebilir dosyasını çağırmanız ve yönergelerinizi sağlamak için –command parametresini kullanmanız gerekir:

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

Daha önce olduğu gibi, KOMUTU MSBuild'den çalıştırdığınızda bazı ek anahtarlar sağlamanız ve ayrılmış XML karakterlerinden kaçış yapmanız gerekir:

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;

Son olarak, daha önce olduğu gibi, komutunu yürütmek için özel bir MSBuild hedefi içinde Exec görevini kullanabilirsiniz:

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

Bu hedefi derleme işleminizin bir parçası olarak yürüttüğünüzde, Windows PowerShell betiğinizi –computername bağımsız değişkeninde belirttiğiniz bilgisayarda çalıştırır.

Sonuç

Bu konuda, MSBuild proje dosyasından bir Windows PowerShell betiğinin nasıl çalıştırıldığı açıklanmıştır. Otomatik veya tek adımlı derleme ve dağıtım işleminin bir parçası olarak yerel olarak veya uzak bir bilgisayarda Windows PowerShell betiği çalıştırmak için bu yaklaşımı kullanabilirsiniz.

Daha Fazla Bilgi

Windows PowerShell betiklerini imzalama ve yürütme ilkelerini yönetme yönergeleri için bkz. Windows PowerShell Betiklerini Çalıştırma. Uzak bir bilgisayardan Windows PowerShell komutlarını çalıştırma hakkında yönergeler için bkz. Uzak Komutları Çalıştırma.

Dağıtım işlemini denetlemek için özel MSBuild proje dosyalarını kullanma hakkında daha fazla bilgi için bkz. Proje Dosyasını Anlama ve Derleme sürecini anlama.