다음을 통해 공유


콘텐츠를 포함하는 파일 만들기

설명

이 예제에서는 리소스를 Script 사용하여 파일을 만드는 방법을 보여줍니다.

리소스를 Script 사용하려면 세 개의 코드 블록을 지정해야 합니다. GetScript, TestScriptSetScript입니다.

이 예제에서는 사용자 입력의 두 매개 변수를 사용합니다. FilePath 는 파일이 있어야 하는 경로를 설정하고 FileContent 는 파일의 내용을 설정합니다. 이러한 값은 지시문을 사용하여 scriptblocks에서 using 참조됩니다.

GetScript

$fileContent = $null

if (Test-Path -Path $using:FilePath) {
    $fileContent = Get-Content -Path $using:filePath -Raw
}

return @{
    Result = $fileContent
}

GetScript scriptblock에서 코드는 FilePath에서 지정한 파일이 있는지 확인합니다. 이 경우 scriptblock은 결과에 대한 해당 파일의 현재 콘텐츠를 반환합니다. 그렇지 않으면 scriptblock이 결과에 대해 반환됩니다 $null .

TestScript

if (Test-Path -Path $using:FilePath) {
    $fileContent = Get-Content -Path $using:filePath -Raw
    return ($fileContent -eq $using:FileContent)
} else {
    return $false
}

TestScript scriptblock에서 코드는 FilePath에서 지정한 파일이 있는지 확인합니다. 그렇지 않으면 scriptblock이 반환됩니다 $false. 파일이 있는 경우 코드는 파일의 현재 콘텐츠를 FileContent에서 지정한 내용과 비교합니다. 내용이 일치하면 scriptblock이 반환됩니다 $true. 그렇지 않으면 scriptblock이 반환됩니다 $false.

SetScript

$streamWriter = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList @(
    $using:FilePath
)
$streamWriter.WriteLine($using:FileContent)
$streamWriter.Close()

SetScript scriptblock에서 코드는 FilePath에서 지정한 파일에 쓸 System.IO.StreamWriter 개체를 만듭니다. FileContent에서 지정한 콘텐츠를 쓴 다음 StreamWriter 개체를 닫습니다.

Invoke-DscResource

이 스크립트는 cmdlet과 함께 리소스를 ScriptInvoke-DscResource 사용하여 특정 콘텐츠가 있는 파일이 있는지 확인하는 방법을 보여 줍니다.

[CmdletBinding()]
param(
    [Parameter(Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [String]
    $FilePath,

    [Parameter(Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [String]
    $FileContent
)

begin {
    $SharedParameters = @{
        Name       = 'Script'
        ModuleName = 'PSDscResource'
        Properties = @{
            SetScript = {
                $streamWriter = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList @(
                    $using:FilePath
                )
                $streamWriter.WriteLine($using:FileContent)
                $streamWriter.Close()
            }
            TestScript = {
                if (Test-Path -Path $using:FilePath) {
                    $fileContent = Get-Content -Path $using:filePath -Raw
                    return ($fileContent -eq $using:FileContent)
                } else {
                    return $false
                }
            }
            GetScript = {
                $fileContent = $null

                if (Test-Path -Path $using:FilePath) {
                    $fileContent = Get-Content -Path $using:filePath -Raw
                }

                return @{
                    Result = $fileContent
                }
            }
        }
    }
}

process {
    $TestResult = Invoke-DscResource -Method Test @SharedParameters

    if ($TestResult.InDesiredState) {
        Invoke-DscResource -Method Get @SharedParameters
    } else {
        Invoke-DscResource -Method Set @SharedParameters
    }
}

구성을 사용하여

이 코드 조각에서는 리소스 블록으로 ConfigurationScript 정의하여 특정 콘텐츠가 포함된 파일이 있는지 확인하는 방법을 보여 줍니다.

Configuration ScriptExample {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]
        $FilePath,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]
        $FileContent
    )

    Import-DscResource -ModuleName 'PSDscResources'

    Node localhost {
        Script ScriptExample {
            SetScript = {
                $streamWriter = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList @(
                    $using:FilePath
                )
                $streamWriter.WriteLine($using:FileContent)
                $streamWriter.Close()
            }
            TestScript = {
                if (Test-Path -Path $using:FilePath) {
                    $fileContent = Get-Content -Path $using:filePath -Raw
                    return ($fileContent -eq $using:FileContent)
                } else {
                    return $false
                }
            }
            GetScript = {
                $fileContent = $null

                if (Test-Path -Path $using:FilePath) {
                    $fileContent = Get-Content -Path $using:filePath -Raw
                }

                return @{
                    Result = $fileContent
                }
            }
        }
    }
}