Bagikan melalui


Mulai Cepat Host Windows PowerShell

Untuk menghosting Windows PowerShell di aplikasi, Anda menggunakan kelas System.Management.Automation.PowerShell. Kelas ini menyediakan metode yang membuat alur perintah lalu menjalankan perintah tersebut di runspace. Cara paling sederhana untuk membuat aplikasi host adalah dengan menggunakan runspace default. Runspace default berisi semua perintah inti Windows PowerShell. Jika Anda ingin aplikasi Anda hanya mengekspos subset perintah Windows PowerShell, Anda harus membuat runspace kustom.

Menggunakan runspace default

Untuk memulai, kita akan menggunakan runspace default, dan menggunakan metode kelas System.Management.Automation.PowerShell untuk menambahkan perintah, parameter, pernyataan, dan skrip ke alur.

AddCommand

Anda menggunakan System.Management.Automation.PowerShell.AddCommand metode untuk menambahkan perintah ke alur. Misalnya, Anda ingin mendapatkan daftar proses yang sedang berjalan pada komputer. Cara menjalankan perintah ini adalah sebagai berikut.

  1. Buat objek System.Management.Automation.PowerShell.

    PowerShell ps = PowerShell.Create();
    
  2. Tambahkan perintah yang ingin Anda jalankan.

    ps.AddCommand("Get-Process");
    
  3. Panggil perintah .

    ps.Invoke();
    

Jika Anda memanggil metode AddCommand lebih dari sekali sebelum Anda memanggil metode System.Management.Automation.PowerShell.Invoke, hasil perintah pertama disalurkan ke yang kedua, dan sebagainya. Jika Anda tidak ingin menyalurkan hasil perintah sebelumnya ke perintah, tambahkan dengan memanggil System.Management.Automation.PowerShell.AddStatement sebagai gantinya.

AddParameter

Contoh sebelumnya menjalankan satu perintah tanpa parameter apa pun. Anda dapat menambahkan parameter ke perintah dengan menggunakan System.Management.Automation.PSCommand. metodeAddParameter. Misalnya, kode berikut mendapatkan daftar semua proses yang diberi nama powershell berjalan di komputer.

PowerShell.Create().AddCommand("Get-Process")
                   .AddParameter("Name", "powershell")
                   .Invoke();

Anda dapat menambahkan parameter tambahan dengan memanggil metode AddParameter berulang kali.

PowerShell.Create().AddCommand("Get-ChildItem")
                   .AddParameter("Path", @"C:\Windows")
                   .AddParameter("Filter", "*.exe")
                   .Invoke();

Anda juga dapat menambahkan kamus nama dan nilai parameter dengan memanggil metode System.Management.Automation.PowerShell.AddParameters.

IDictionary parameters = new Dictionary<String, String>();
parameters.Add("Path", @"C:\Windows");
parameters.Add("Filter", "*.exe");

PowerShell.Create().AddCommand("Get-Process")
   .AddParameters(parameters)
      .Invoke()

AddStatement

Anda dapat mensimulasikan batching dengan menggunakan System.Management.Automation.PowerShell.AddStatement metode, yang menambahkan pernyataan tambahan ke akhir alur. Kode berikut mendapatkan daftar proses yang sedang berjalan dengan nama powershell, lalu mendapatkan daftar layanan yang sedang berjalan.

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process").AddParameter("Name", "powershell");
ps.AddStatement().AddCommand("Get-Service");
ps.Invoke();

AddScript

Anda dapat menjalankan skrip yang sudah ada dengan memanggil System.Management.Automation.PowerShell. metodeAddScript. Contoh berikut menambahkan skrip ke alur dan menjalankannya. Contoh ini mengasumsikan sudah ada skrip bernama MyScript.ps1 dalam folder bernama D:\PSScripts.

PowerShell ps = PowerShell.Create();
ps.AddScript("D:\PSScripts\MyScript.ps1").Invoke();

Ada juga versi metode AddScript yang mengambil parameter boolean bernama useLocalScope. Jika parameter ini diatur ke true, maka skrip dijalankan dalam cakupan lokal. Kode berikut akan menjalankan skrip dalam cakupan lokal.

PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:\PSScripts\MyScript.ps1", true).Invoke();

Membuat runspace kustom

Meskipun runspace default yang digunakan dalam contoh sebelumnya memuat semua perintah inti Windows PowerShell, Anda dapat membuat runspace kustom yang hanya memuat subset tertentu dari semua perintah. Anda mungkin ingin melakukan ini untuk meningkatkan performa (memuat sejumlah besar perintah adalah hit performa), atau untuk membatasi kemampuan pengguna untuk melakukan operasi. Runspace yang hanya mengekspos sejumlah perintah terbatas disebut runspace yang dibatasi. Untuk membuat runspace yang dibatasi, Anda menggunakan kelas System.Management.Automation.Runspaces.Runspace dan System.Management.Automation.Runspaces.InitialSessionState.

Membuat objek InitialSessionState

Untuk membuat runspace kustom, Anda harus terlebih dahulu membuat objek System.Management.Automation.Runspaces.InitialSessionState. Dalam contoh berikut, kami menggunakan System.Management.Automation.Runspaces.RunspaceFactory untuk membuat runspace setelah membuat objek InitialSessionState default.

InitialSessionState iss = InitialSessionState.CreateDefault();
Runspace rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
ps.AddCommand("Get-Command");
ps.Invoke();
rs.Close();

Membatasi runspace

Dalam contoh sebelumnya, kami membuat objek System.Management.Automation.Runspaces.InitialSessionState default yang memuat semua inti bawaan Windows PowerShell. Kita juga bisa memanggil metode System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2 untuk membuat objek InitialSessionState yang hanya akan memuat perintah di snapin Microsoft.PowerShell.Core. Untuk membuat runspace yang lebih dibatasi, Anda harus membuat objek InitialSessionState kosong dengan memanggil metode System.Management.Automation.Runspaces.InitialSessionState.Create, lalu menambahkan perintah ke InitialSessionState.

Menggunakan runspace yang hanya memuat perintah yang Anda tentukan memberikan performa yang ditingkatkan secara signifikan.

Anda menggunakan metode kelas System.Management.Automation.Runspaces.SessionStateCmdletEntry untuk menentukan cmdlet untuk status sesi awal. Contoh berikut membuat status sesi awal kosong, lalu menentukan dan menambahkan perintah Get-Command dan Import-Module ke status sesi awal. Kami kemudian membuat runspace yang dibatasi oleh status sesi awal tersebut, dan menjalankan perintah di runspace tersebut.

Buat status sesi awal.

InitialSessionState iss = InitialSessionState.Create();

Tentukan dan tambahkan perintah ke status sesi awal.

SessionStateCmdletEntry getCommand = new SessionStateCmdletEntry(
    "Get-Command", typeof(Microsoft.PowerShell.Commands.GetCommandCommand), "");
SessionStateCmdletEntry importModule = new SessionStateCmdletEntry(
    "Import-Module", typeof(Microsoft.PowerShell.Commands.ImportModuleCommand), "");
iss.Commands.Add(getCommand);
iss.Commands.Add(importModule);

Buat dan buka runspace.

Runspace rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();

Jalankan perintah dan tampilkan hasilnya.

PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
ps.AddCommand("Get-Command");
Collection<CommandInfo> result = ps.Invoke<CommandInfo>();
foreach (var entry in result)
{
    Console.WriteLine(entry.Name);
}

Tutup runspace.

rs.Close();

Saat dijalankan, output kode ini akan terlihat sebagai berikut.

Get-Command
Import-Module