스크립트 워크플로 작성

 

적용 대상: Windows Server 2012, Windows Server 2012 R2

이 섹션의 항목에서는 Windows PowerShell® 스크립트 언어(Windows PowerShell에서 함수 및 스크립트를 작성하는 데 사용하는 것과 동일한 언어)로 워크플로를 작성하는 방법에 대해 설명합니다. 작성한 워크플로를 명령줄에서 실행하고, 스크립트 및 스크립트 모듈에 포함할 수 있습니다.

Windows Workflow Foundation의 기본 언어인 XAML로 워크플로를 작성하는 방법에 대한 자세한 내용은 MSDN 라이브러리에서 Windows PowerShell 워크플로 작성을 참조하세요.

워크플로 계획

Windows PowerShell 워크플로는 수백 대의 컴퓨터가 실행될 때마다 데이터를 수집하고 변경 내용을 적용할 수 있는 강력한 솔루션입니다. 간소성 및 효율성을 위한 워크플로 디자인 계획 워크플로는 자체적으로 일시 중단되거나 사용자가 일시 중단할 수 있고, 단일 서버 쪽 프로세스에 연결된 수많은 PSSession에서 제어할 수 있으며, 함께 실행되는 명령 및 기능과 함께 다시 시작 후 유지될 수 있고, 각 명령이 고유한 세션에서 실행됩니다.

다음 계획 지침을 사용하세요.

  • 워크플로를 처음 사용하는 경우 스크립트 워크플로와 스크립트의 구문 차이점 등 이 섹션의 참조 항목을 검토하세요.

  • 워크플로에서 수행할 작업을 열거하는 것부터 시작합니다. 동시에 실행할 수 있거나 미리 정해진 순서대로 실행할 필요가 없는 섹션을 표시합니다. 이러한 섹션 내에 순차적으로 실행해야 하는 항목을 표시합니다.

  • 작업을 워크플로 내의 함수로 정리합니다. 각 작업에서 기존 Windows PowerShell cmdlet을 사용하거나 새 명령을 만들고 중요 단계 후 검사점을 추가합니다.

  • 워크플로는 여러 대상 컴퓨터에서 실행되도록 설계되었습니다. 따라서 워크플로에서 원격 세션을 만들거나 원격 명령(예: Invoke-Command cmdlet을 사용하는 명령)을 사용할 필요가 없습니다.

  • 여러 컴퓨터에서 실행되는 스크립트와 마찬가지로 다양한 운영 체제, 장치, 파일 시스템 구성, 환경 변수, Windows PowerShell 버전 등 스크립트의 작동에 영향을 줄 수 있는 컴퓨터 간의 변형을 고려합니다.

  • 워크플로에 대한 도움말 항목을 미리 계획합니다. 기본 설정된 워크플로 아키텍처, 기본 설정된 세션 구성 특성 및 사용 권한을 포함하여 사용자에게 전달해야 하는 정보를 기록합니다.

워크플로를 작성하려면 워크플로 구문을 적용하고 구문 오류를 강조 표시하는 Windows PowerShell ISE(통합 스크립팅 환경)와 같은 스크립트 편집기를 사용합니다. 스크립트와 워크플로 간에는 명확한 구문 차이가 있으므로 스크립트뿐 아니라 워크플로도 인식하는 도구를 사용하면 코딩 및 테스트 시간을 크게 단축할 수 있습니다.

워크플로에 적합한 작업에 대한 자세한 내용은 Windows PowerShell 워크플로 소개에서 "워크플로와 Windows PowerShell 스크립트의 차이점"을 참조하세요.

워크플로 키워드

Windows PowerShell에 워크플로 명령을 식별하는 workflow 키워드로 시작합니다.workflow 키워드는 스크립트 워크플로에 필요합니다. 워크플로 이름은 workflow 키워드 뒤에 나옵니다. 워크플로 본문은 중괄호로 묶여 있습니다.

다음은 Workflow 키워드에 대한 구문 다이어그램입니다.

workflow Test-Workflow
{
    ...
}

Windows PowerShell 스크립트 언어의 키워드에 대한 자세한 내용은 about_Language_Keywords를 참조하세요.

워크플로 및 워크플로 요소 이름 지정

워크플로는 Windows PowerShell 명령 형식입니다. 동사-명사 형식의 이름을 선택합니다.Get-Verb cmdlet 및 Windows PowerShell 명령에 대해 승인된 동사 도움말 항목을 사용하여 이름에 대해 승인된 동사를 선택합니다.Windows PowerShell에서는 승인된 동사가 포함되지 않은 명령을 모듈에서 가져온 경우 경고를 생성합니다. 설명이 포함된 명사와 명사 접두사(필요한 경우)를 사용하여 워크플로를 세션으로 가져올 때 명령 이름 충돌을 방지할 수 있습니다.

워크플로의 매개 변수 이름 및 변수 이름은 문자, 숫자, 하이픈(-) 및 밑줄(_) 문자만 포함할 수 있습니다. 워크플로와 워크플로 호출에서 하이픈이 있는 매개 변수 이름을 사용할 때는 매번 중괄호로 묶어야 하므로 매개 변수 이름에는 하이픈 문자를 사용하지 않는 것이 좋습니다.워크플로 일반 매개 변수, 워크플로 런타임 변수 또는 기타 예약어(예: "workflow" 및 "parallel")로 된 이름을 사용하지 마세요.

워크플로 런타임 매개 변수에 대한 자세한 내용은 MSDN 라이브러리에서 PSWorkflowRuntimeVariable 열거형 도움말 항목을 참조하세요.

예약어에 대한 자세한 내용은 스크립트 워크플로와 스크립트의 구문 차이점about_Reserved_Words에서 "워크플로의 예약어"를 참조하세요.

워크플로에 매개 변수를 추가하는 방법

워크플로에 매개 변수를 추가하려면 Param 키워드를 선택적 Parameter 특성과 함께 사용합니다. 이는 함수에 매개 변수를 추가하는 데 사용되는 방법과 같습니다.

다음 코드 블록에서는 스크립트 워크플로의 Param 키워드 및 Parameter 특성 구문을 보여 줍니다.

workflow Test-Workflow
{
param ([Type]$<ParameterName>)
}

workflow Test-Workflow
{
    Param
    (
        [Parameter(Mandatory=<$True | $False>)]
        [<Type>]
        $<ParameterName>
    )
}

CmdletBinding 특성을 사용하여 ConfirmImpact, DefaultParameterSetName, HelpUriSupportsShouldProcess 특성을 지정할 수도 있습니다.

다음 코드 블록에서는 CmdletBinding 특성을 사용하는 샘플 워크플로의 구문을 보여 줍니다.

workflow Test-Workflow
{   
    [CmdletBinding(ConfirmImpact=<String>,
        DefaultParameterSetName=<String>,
        HelpURI=<URI>,
        PositionalBinding=<Boolean>)]

    Param
    (
        [parameter(Mandatory=$true)]
        [String[]]
        $<ParameterName>
    )
}

워크플로 일반 매개 변수는 워크플로에 추가할 필요가 없습니다.Windows PowerShell 워크플로는 CmdletBinding 특성 또는 Parameter 특성이 없는 단순 워크플로를 포함하여 모든 워크플로에 일반 매개 변수 및 워크플로 일반 매개 변수를 추가합니다.

함수 및 워크플로의 매개 변수에 대한 자세한 내용은 다음 도움말 항목을 참조하세요.

워크플로에 활동을 추가하는 방법

활동은 워크플로의 기본 작업 단위입니다. 워크플로에서 사용하는 모든 명령과 식은 활동으로 실행됩니다.Windows PowerShell 워크플로에서 활동은 cmdlet과 매우 유사합니다. 활동 이름 뒤에 매개 변수를 입력하여 활동을 실행합니다.Windows PowerShell 워크플로는 Windows PowerShell에 포함된 많은 cmdlet을 활동으로 변환합니다. 제외된 cmdlet은 소수에 불과합니다. 제외된 cmdlet 목록은 스크립트 워크플로에서 활동 사용에서 "제외된 Cmdlet"을 참조하세요.

대부분의 Windows PowerShell Core cmdlet은 활동으로 구현되었습니다. 이러한 cmdlet을 워크플로에서 사용하려면 cmdlet 이름 또는 cmdlet 별칭을 입력하기만 하면 됩니다.

예를 들어 다음 워크플로에는 Get-Process 활동이 포함되어 있습니다.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    gps -Name Winword
}

cmdlet에 일치하는 활동이 없고 명시적으로 제외되지 않은 경우 Windows PowerShell 워크플로는 inlineScript 활동에서 해당 cmdlet을 자동으로 실행하고 워크플로에 출력을 반환합니다.

예를 들어 다음 워크플로는 inlineScript 활동에서 암시적으로 실행되는 Get-WindowsFeature cmdlet을 사용합니다.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
}

활동으로 구현되지 않아 제외된 cmdlet도 실행할 수 있지만 이러한 cmdlet은 inlineScript 활동에서 실행해야 합니다. 예를 들어 다음 워크플로에서는 inlineScript 활동을 사용하여 제외된 Get-Variable cmdlet을 실행합니다.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

산술 식과 비교 문을 포함하여 워크플로에서 식을 사용할 수도 있습니다.Windows PowerShell 워크플로는 해당 용도로 설계된 특수한 활동에서 식을 자동으로 실행합니다.

예를 들어 다음 워크플로에는 식이 포함되어 있습니다. 모든 식과 마찬가지로 활동에서 실행됩니다.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable PSHome }

    320GB / 3MB
}

활동에 대한 자세한 내용은 스크립트 워크플로에서 활동 사용을 참조하세요.

활동의 매개 변수를 사용하는 방법

활동은 cmdlet과 마찬가지로 매개 변수가 있는 명령입니다. cmdlet이 활동으로 변환될 때 구문 및 매개 변수는 동일하게 유지됩니다. 몇 가지 예외가 있으며, 이는 "스크립트 워크플로의 활동" 도움말 항목에 나와 있습니다.

그러나 위치 매개 변수는 활동에서 유효하지 않으므로 모든 매개 변수 이름은 필수 사항입니다. 매개 변수 별칭 및 약어도 허용됩니다. 예를 들어 다음 샘플 워크플로에서는 명령에 Get-Process, Get-WindowsFeatureGet-Variable cmdlet의 Name 매개 변수가 표시됩니다.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

동적 매개 변수도 활동에서 유효하지 않습니다. 동적 매개 변수를 호출하려면 InlineScript 활동으로 명령을 묶습니다. 예를 들어 다음 워크플로에는 Get-ChildItem cmdlet의 동적 매개 변수 CodeSigningCert를 사용하는 inlineScript 활동이 포함되어 있습니다.CodeSigningCert 매개 변수는 인증서 공급자에 의해 추가되며 Cert: 드라이브에서만 작동합니다.

workflow Test-Workflow
{
   InlineScript {Get-ChildItem -Path Cert:\CurrentUser -CodeSigningCert}
} 

inlineScript 활동에 대한 자세한 내용은 워크플로에서 Windows PowerShell 명령 실행을 참조하세요.

활동 일반 매개 변수를 사용하는 방법

Windows PowerShell 워크플로는 활동에 활동 일반 매개 변수 집합을 추가합니다. 이러한 매개 변수를 통해 다중 컴퓨터 환경에서 중요한 옵션을 설정할 수 있습니다.

워크플로 일반 매개 변수 중 일부는 활동 일반 매개 변수이기도 합니다. 이 기능을 사용하여 워크플로 일반 매개 변수 값에 대한 활동별 예외를 만들 수 있습니다. 예를 들어 활동의 PSComputerName 매개 변수를 사용하여 선택한 컴퓨터에서만 활동을 실행하거나, PSCredential 매개 변수를 사용하여 대체 자격 증명으로 활동을 실행할 수 있습니다.

활동 일반 매개 변수는 대부분의 활동에 유효하지만 일부 활동에는 적용되지 않습니다. 예를 들어 Suspend-WorkflowCheckpoint-Workflow 활동에는 활동 일반 매개 변수가 유효하지 않습니다. 또한 Windows PowerShell 워크플로가 활동에서 자동으로 실행하는 cmdlet 또는 식에서는 활동 일반 매개 변수를 사용할 수 없습니다.InlineScript 활동에서는 활동 일반 매개 변수를 사용할 수 있지만 InlineScript 스크립트 블록의 명령에서는 사용할 수 없습니다.

다음 워크플로의 활동에서는 유효한 곳에 활동 일반 매개 변수를 사용합니다.

workflow Test-Workflow
{
    Get-Process -Name PowerShell -PSComputerName Server01, Server 12
    InlineScript { Get-Variable -Name PSHome } -PSRunningTimeoutSec 3600

    #No activity common parameters.
    Get-WindowsFeature -Name PowerShell, PowerShell-v2  

    #No activity common parameters.
    320GB / 3MB
}

활동 일반 매개 변수에 대한 자세한 내용은 스크립트 워크플로에서 활동 사용을 참조하세요.

일반 매개 변수 값을 가져오는 방법

Windows PowerShell 워크플로는 모든 워크플로에 워크플로 런타임 변수를 추가합니다. 워크플로 런타임 변수는 일반 매개 변수 값, 워크플로 일반 매개 변수 값 및 워크플로에 중요한 다른 값을 포함합니다.

변수 값은 매우 유용합니다. 이러한 값을 검토하고 워크플로에서 사용해 보세요. 예를 들어 워크플로를 실행할 때 PSComputerName 매개 변수는 대상 컴퓨터의 이름을 가져오지만 워크플로에서 $PSComputerName 변수에 액세스할 때는 현재 워크플로를 실행 중인 컴퓨터의 이름을 포함합니다.

워크플로 런타임 변수에 대한 내용은 PSWorkflowRuntimeVariable 열거형을 참조하세요.

워크플로 내에서 매개 변수 값에 액세스하려면 변수 이름을 사용합니다. 변수를 정의할 필요가 없습니다.

예를 들어 다음 워크플로에서는 $PSConnectionRetryCount 변수로 참조하여 PSConnectionRetryCount 일반 매개 변수 값을 사용합니다.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

다음 예에서는 워크플로를 실행할 때 PSConnectionRetryCount 매개 변수를 사용하면 매개 변수 값이 워크플로에 표시됨을 보여 줍니다.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

워크플로에서 런타임 및 일반 매개 변수 값을 변경하려면 Set-PSWorkflowData 활동을 사용합니다.

예를 들어 다음 워크플로에는 PSConnectionRetryCount 값을 변경하는 명령이 포함되어 있습니다.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

Windows PowerShell 워크플로의 변수에 대한 자세한 내용은 다음 도움말 항목을 참조하세요.

런타임 변수 및 일반 매개 변수 값을 가져오는 방법

Windows PowerShell 워크플로는 모든 워크플로에 워크플로 런타임 변수를 추가합니다. 워크플로 런타임 변수는 일반 매개 변수 값, 워크플로 일반 매개 변수 값 및 워크플로에 중요한 다른 값을 포함합니다.

변수 값은 매우 유용합니다. 이러한 값을 검토하고 워크플로에서 사용해 보세요. 예를 들어 워크플로를 실행할 때 PSComputerName 매개 변수는 대상 컴퓨터의 이름을 가져오지만 워크플로에서 $PSComputerName 변수에 액세스할 때는 현재 워크플로를 실행 중인 컴퓨터의 이름을 포함합니다.

워크플로 런타임 변수에 대한 내용은 PSWorkflowRuntimeVariable 열거형을 참조하세요.

워크플로 내에서 매개 변수 값에 액세스하려면 변수 이름을 사용합니다. 변수를 정의할 필요가 없습니다.

예를 들어 다음 워크플로에서는 $PSConnectionRetryCount 변수로 참조하여 PSConnectionRetryCount 일반 매개 변수 값을 사용합니다.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

다음 예에서는 워크플로를 실행할 때 PSConnectionRetryCount 매개 변수를 사용하면 매개 변수 값이 워크플로에 표시됨을 보여 줍니다.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

워크플로에서 런타임 및 일반 매개 변수 값을 변경하려면 Set-PSWorkflowData 활동을 사용합니다.

예를 들어 다음 워크플로에는 PSConnectionRetryCount 값을 변경하는 명령이 포함되어 있습니다.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

Windows PowerShell 워크플로의 변수에 대한 자세한 내용은 다음 도움말 항목을 참조하세요.

워크플로에서 스크립트를 실행하는 방법

워크플로에서 스크립트(.ps1 파일)를 실행하려면 스크립트에 대한 호출을 InlineScript 활동으로 묶습니다. 다른 명령 및 활동과 마찬가지로 스크립트는 모든 워크플로 대상 컴퓨터에서 실행되며, 워크플로로 출력이 반환됩니다.

예를 들어 다음 워크플로에는 스크립트를 실행하는 InlineScript 활동이 포함되어 있습니다. 스크립트는 공유 디렉터리에 저장됩니다. 워크플로에서는 PSPersist 활동 매개 변수를 사용하여 스크립트가 완료된 경우 검사점을 만듭니다.

workflow Test-Workflow
{
   $AssetData =InlineScript {\\Server01\Share01\Get-AssetData.ps1 -All} -PSPersist
   ...
}

워크플로는 여러 컴퓨터에서 실행되도록 설계되었으므로 상대 경로 대신 스크립트 파일의 절대 경로를 사용합니다.

동시에 명령을 실행하는 방법

ParallelForEach -Parallel 키워드는 명령을 정해진 순서 없이 동시에 실행하여 워크플로를 최적화합니다.Sequence 키워드는 Parallel 스크립트 블록 내에서 선택된 명령을 순차적으로 실행합니다. 이러한 키워드는 워크플로에서만 유효합니다. 중첩된 워크플로에서는 유효하지만 워크플로의 중첩된 함수에서는 유효하지 않습니다. 기본적으로 명령은 다음 명령이 시작되기 전에 각 명령이 완료된 순서대로 실행됩니다.

병렬 실행은 특히 워크플로가 많은 컴퓨터를 대상으로 하는 경우 성능을 크게 개선할 수 있으므로 가급적 사용하는 것이 좋습니다.

병렬 실행에 적합한 유형의 명령 및 활동은 다음과 같습니다.

  • Get-ProcessGet-Service 명령과 같이 데이터를 공유하지 않는 명령

  • 유사한 항목의 컬렉션에서 실행되는 명령. 대부분의 ForEach 문은 ForEach -Parallel 실행에 적합합니다.

Parallel

Parallel 스크립트 블록의 명령은 동시에 실행될 수 있습니다. 실행 순서가 정해져 있지 않습니다.

다음 다이어그램에서는 Parallel 키워드 및 스크립트 블록이 있는 워크플로의 구문을 보여 줍니다.

workflow Test-Workflow
{
    Parallel
    {
         <Activity>
         <Activity>
...
    }
}

예를 들어 다음 워크플로에는 컴퓨터의 프로세스 및 서비스를 가져오는 활동을 실행하는 Parallel 스크립트 블록이 포함되어 있습니다. Get-Process 호출과 Get-Service 호출은 독립적이므로 순서에 상관없이 동시에 실행할 수 있습니다.

workflow Test-Workflow
{
    Parallel
    {
         Get-Process
         Get-Service
    }
}

ForEach -Parallel

ForEach 키워드의 Parallel 매개 변수는 지정된 컬렉션의 각 항목에 대해 한 번씩 ForEach 스크립트 블록의 명령을 실행합니다. 컬렉션의 항목은 동시에 처리되고, 스크립트 블록의 명령은 순차적으로 실행됩니다.

Windows PowerShell의 ForEach 문과 마찬가지로 컬렉션($<Collection>)을 포함하는 변수는 ForEach -Parallel 문 앞에 정의되어야 하지만, 현재 항목($<item>)을 나타내는 변수는 ForEach -Parallel 문에서 정의됩니다.

다음 다이어그램에서는 명령 구문을 보여 줍니다.

workflow Test-Workflow
{
    ForEach -Parallel ($<item> in $<collection>)
    {
       <Activity1>
       <Activity2>
 ...
    }
}

예를 들어 다음 워크플로에는 Get-Disk 활동에서 가져온 디스크를 처리하는 Foreach -Parallel 문이 포함되어 있습니다. 스크립트 블록의 명령은 순차적으로 실행되지만 디스크에서는 동시에 실행됩니다.

workflow Test-Workflow
{
    $Disks = Get-Disk
    ForEach -Parallel ($Disk in $Disks)
    {
        $DiskPath = $Disk.Path   
        $Disk | Initialize-Disk
        Set-Disk -Path $DiskPath
    }
}

Sequence

Sequence 키워드는 Parallel 스크립트 블록 내에서 명령을 순서대로 실행합니다.Sequence 스크립트 블록은 다른 명령과 동시에 실행되지만, Sequence 스크립트 블록 내의 명령은 지정된 순서대로 순차적으로 실행됩니다.

다음 코드 블록에서는 Sequence 스크립트 블록의 구문을 보여 줍니다. Activity 3은 Activity 1 및 Activity 2보다 이전에 실행되거나 동시에 실행될 수 있지만 Activity 4는 Activity 3이 완료될 때까지 실행되지 않습니다.

workflow Test-Workflow
{
    parallel
    {
       <Activity1>
       <Activity2>

       sequence 
       {
           <Activity3>
           <Activity4>
           ...
       }
        ...
    }
}