إنشاء ملف يحتوي على محتوى

الوصف

يوضح هذا المثال كيفية استخدام Script المورد لإنشاء ملف.

لاستخدام Script المورد، تحتاج إلى تحديد ثلاث كتل تعليمات برمجية. GetScriptوTestScript و SetScript.

يستخدم هذا المثال معلمتين لإدخال المستخدم. يعين 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 بإرجاع محتويات هذا الملف الحالية للنتيجة. إذا لم يحدث ذلك، يعود $null scriptblock للنتيجة.

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 موجودا. إذا لم يكن كذلك، فسيرجع $falsescriptblock . إذا كان موجودا، فإن التعليمات البرمجية تقارن المحتويات الحالية للملف بالمحتويات المحددة بواسطة FileContent. إذا تطابقت المحتويات، يرجع $truescriptblock . إذا لم يحدث ذلك، يرجع $falsescriptblock .

SetScript

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

في SetScript scriptblock، تنشئ التعليمات البرمجية كائن System.IO.StreamWriter للكتابة إلى الملف المحدد بواسطة FilePath. يكتب المحتوى المحدد بواسطة FileContent ثم يغلق كائن StreamWriter .

مع Invoke-DscResource

يوضح هذا البرنامج النصي كيف يمكنك استخدام Script المورد مع Invoke-DscResource cmdlet للتأكد من وجود ملف بمحتوى معين.

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

مع تكوين

توضح هذه القصاصة البرمجية كيف يمكنك تعريف Configuration مع كتلة Script موارد للتأكد من وجود ملف بمحتوى معين.

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