다음을 통해 공유


Windows PowerShell 호스트 빠른 시작

애플리케이션에서 Windows PowerShell을 호스트하려면 System.Management.Automation.PowerShell 클래스를 사용합니다. 이 클래스는 명령 파이프라인을 만든 다음 Runspace에서 해당 명령을 실행하는 메서드를 제공합니다. 호스트 애플리케이션을 만드는 가장 간단한 방법은 기본 Runspace를 사용하는 것입니다. 기본 Runspace에는 모든 핵심 Windows PowerShell 명령이 포함됩니다. 애플리케이션이 Windows PowerShell 명령의 하위 집합만 노출하도록 하려면 사용자 지정 Runspace를 만들어야 합니다.

기본 Runspace 사용

시작하려면 기본 Runspace를 사용하고 System.Management.Automation.PowerShell 클래스의 메서드를 사용하여 명령, 매개 변수, 문 및 스크립트를 파이프라인에 추가합니다.

AddCommand

System.Management.Automation.PowerShell 사용합니다. 파이프라인에 명령을 추가하는AddCommand 메서드입니다. 예를 들어 컴퓨터에서 실행 중인 프로세스 목록을 가져올 수 있다고 가정해 보겠습니다. 이 명령을 실행하는 방법은 다음과 같습니다.

  1. System.Management.Automation.PowerShell 개체를 만듭니다.

    PowerShell ps = PowerShell.Create();
    
  2. 실행할 명령을 추가합니다.

    ps.AddCommand("Get-Process");
    
  3. 명령을 호출합니다.

    ps.Invoke();
    

System.Management.Automation.PowerShell.Invoke 메서드를 호출하기 전에 AddCommand 메서드를 두 번 이상 호출하면 첫 번째 명령의 결과가 두 번째 명령으로 파이프됩니다. 이전 명령의 결과를 명령에 파이프하지 않으려면 System.Management.Automation.PowerShell을 호출하여 추가합니다. 대신AddStatement.

AddParameter

이전 예제에서는 매개 변수 없이 단일 명령을 실행합니다. System.Management.Automation.PSCommand를 사용하여 명령에 매개 변수를 추가할 수 있습니다.AddParameter 메서드입니다. 예를 들어 다음 코드는 컴퓨터에서 실행되는 powershell 명명된 모든 프로세스의 목록을 가져옵니다.

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

AddParameter 메서드를 반복적으로 호출하여 매개 변수를 추가할 수 있습니다.

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

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

System.Management.Automation.PowerShell을 사용하여 일괄 처리를 시뮬레이션할 수 있습니다. 파이프라인의 끝에 추가 문을 추가하는AddStatement 메서드입니다. 다음 코드는 이름이 powershell실행 중인 프로세스 목록을 가져오고 실행 중인 서비스 목록을 가져옵니다.

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

AddScript

System.Management.Automation.PowerShell을 호출하여 기존 스크립트를 실행할 수 있습니다.AddScript 메서드입니다. 다음 예제에서는 파이프라인에 스크립트를 추가하고 실행합니다. 이 예제에서는 D:\PSScripts폴더에 MyScript.ps1이라는 스크립트가 이미 있다고 가정합니다.

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

useLocalScope부울 매개 변수를 사용하는 AddScript 메서드 버전도 있습니다. 이 매개 변수가 true설정되면 스크립트가 로컬 범위에서 실행됩니다. 다음 코드는 로컬 범위에서 스크립트를 실행합니다.

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

사용자 지정 Runspace 만들기

이전 예제에서 사용된 기본 Runspace는 모든 핵심 Windows PowerShell 명령을 로드하지만 모든 명령의 지정된 하위 집합만 로드하는 사용자 지정 Runspace를 만들 수 있습니다. 이 작업을 수행하여 성능을 향상시키거나(더 많은 수의 명령을 로드하면 성능이 저하됨) 작업을 수행하는 사용자의 기능을 제한할 수 있습니다. 제한된 수의 명령만 노출하는 Runspace를 제한된 Runspace라고 합니다. 제한된 runspace를 만들려면 system.Management.Automation.Runspaces.Runspace System.Management.Automation.Runspaces.InitialSessionState 클래스를 사용합니다.

InitialSessionState 개체 만들기

사용자 지정 Runspace를 만들려면 먼저 system.Management.Automation.Runspaces.InitialSessionState 개체를 만들어야 합니다. 다음 예제에서는 기본 InitialSessionState 개체를 만든 후 System.Management.Automation.Runspaces.RunspaceFactory 사용하여 Runspace를 만듭니다.

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();

Runspace 제한

이전 예제에서는 기본 제공 핵심 Windows PowerShell을 모두 로드하는 기본 System.Management.Automation.Runspaces.InitialSessionState 개체를 만들었습니다. 또한 System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2 메서드를 호출하여 Microsoft.PowerShell.Core 스냅인의 명령만 로드하는 InitialSessionState 개체를 만들 수도 있습니다. 더 제한된 Runspace를 만들려면 System.Management.Automation.Runspaces.InitialSessionState.Create 메서드를 호출하여 빈 InitialSessionState 개체를 만든 다음 InitialSessionState에 명령을 추가해야 합니다.

지정한 명령만 로드하는 Runspace를 사용하면 성능이 크게 향상됩니다.

System.Management.Automation.Runspaces.SessionStateCmdletEntry 클래스의 메서드를 사용하여 초기 세션 상태에 대한 cmdlet을 정의합니다. 다음 예제에서는 빈 초기 세션 상태를 만든 다음 Get-Command 정의하고 초기 세션 상태에 Import-Module 명령을 추가합니다. 그런 다음, 초기 세션 상태에 의해 제한된 Runspace를 만들고 해당 Runspace에서 명령을 실행합니다.

초기 세션 상태를 만듭니다.

InitialSessionState iss = InitialSessionState.Create();

초기 세션 상태에 명령을 정의하고 추가합니다.

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

Runspace를 만들고 엽니다.

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

명령을 실행하고 결과를 표시합니다.

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);
}

Runspace를 닫습니다.

rs.Close();

실행할 때 이 코드의 출력은 다음과 같습니다.

Get-Command
Import-Module