إدارة ملف النصوص: كيفية قراءة وتحريره باستخدام باورشيل

يحتاج إلى معرفة كيفية استخدام PowerShell لقراءة ملف نصي واستبدال النص؟ هذا ما نسميه ملف PowerShell Read-Text.

لا داعي للبحث بعيدًا! هذه التدوينة في المدونة مخصصة لك. بحلول نهاية التدوينة، سأريك وظيفة بنيتها لتسهيل حياتك كثيرًا.

استبدال النص في ملف بـ PowerShell هو عملية مكونة من ثلاث خطوات.

  1. قراءة الملف
  2. البحث عن السلسلة واستبدالها
  3. كتابة التغييرات إلى الملف.

قراءة الملف

يجب عليك أولاً قراءة الملف. دعونا نقوم أولاً بإنشاء واحد باستخدام cmdlet Set-Content حتى نمتلك ملفًا للعمل به.

Set-Content -Path 'C:\file.txt' -Value 'foo bar baz'

لقراءة هذا الملف، يمكنك استخدام الأمر Get-Content. يمكنك قراءة الملف عن طريق توفير مسار ملف النص لمعلمة Path كما هو موضح أدناه.

$content = Get-Content -Path 'C:\file.txt'

البحث عن السلسلة واستبدالها

الآن بعد أن لدينا محتوى الملف في الذاكرة كنص، نحتاج إلى البحث واستبدال السلسلة. أحد الطرق لفعل ذلك هو استخدام مشغل -replace. يقوم هذا المشغل PowerShell بالبحث عن سلسلة واستبدالها بأخرى.

باستخدام محتوى الملف الذي تمثله الأمثلة، يمكننا توفير سلسلة البحث foo مع سلسلة الاستبدال bar مما يجعل محتوى الملف foo foo baz الآن.

PS> $newContent = $content -replace 'foo', 'bar'
bar bar baz

الكتابة إلى الملف

الآن بعد حفظ محتوى الملف الجديد في $newContent، يمكننا الآن كتابة هذا المحتوى الجديد إلى الملف. أحد الطرق للقيام بذلك هو استخدام أمر Set-Content.

أمر Set-Content يقوم بإستبدال جميع محتويات الملف بقيمة جديدة.

$newContent | Set-Content -Path 'C:\file.txt'

كلما قرأت الملف C:\file.txt بواسطة Get-Content سترى أنه يحتوي الآن على المحتوى الجديد.

التعامل مع مقابض الملفات المفتوحة

الخطوات التي مررت بها سابقًا تعمل… في معظم الأحيان. ومع ذلك، ستجد في العالم الحقيقي أنه لا يحدث دائمًا هكذا.

ستجد أنه في بعض الأحيان يتعين عليك التعامل مع ملفات مفتوحة في PowerShell نفسه. وهذا يمنعك من كتابة المحتوى الجديد إلى الملف.

لحل هذه المشكلة بفتح الملف، قمت بإنشاء سير عمل بسيط يتيح لك إنشاء ملف نص مؤقت على القرص أولاً بالمحتوى الجديد، ومن ثم إزالة الملف الأصلي وإعادة تسمية الملف المؤقت.

فيما يلي مثال على كيفية عمله:

$filePath = 'C:\file.txt'
$tempFilePath = "$env:TEMP\$($filePath | Split-Path -Leaf)"
$find = 'foo'
$replace = 'bar'

(Get-Content -Path $filePath) -replace $find, $replace | Add-Content -Path $tempFilePath

Remove-Item -Path $filePath
Move-Item -Path $tempFilePath -Destination $filePath

أدناه مثال على وظيفة بنيتها تسمى Find-InTextFile والتي تستخدم هذا النهج بالإضافة إلى القدرة على البحث (وليس الاستبدال) عن نص في ملف.

تستخدم هذه الوظيفة أيضًا بناء تعبيرات القواعد النظمية الأقوى للبحث عن سلاسل أيضًا. ستجد أن تعبيرات القواعد النظمية تسمح لك بالبحث بمرونة أكبر باستخدام أحرف خاصة مثل الأقواس والأحرف الخاصة وأكثر من ذلك.

يمكنك أيضًا أن ترى أدناه أنني استخدم حلقة foreach لمعالجة ملفات متعددة في وقت واحد. يكون ذلك مفيدًا إذا كان لديك العديد من الملفات لمعالجتها.

function Find-InTextFile {
    <#
    .SYNOPSIS
        يقوم بالبحث (أو الاستبدال) في سلسلة نصية في ملف نصي أو ملفات.
    .EXAMPLE
        PS> Find-InTextFile -FilePath 'C:\MyFile.txt' -Find 'water' -Replace 'wine'
    
        يستبدل جميع حالات السلسلة 'water' بالسلسلة 'wine' في
        'C:\MyFile.txt'.
    .EXAMPLE
        PS> Find-InTextFile -FilePath 'C:\MyFile.txt' -Find 'water'
    
        يبحث عن جميع حالات السلسلة 'water' في الملف 'C:\MyFile.txt'.
    .PARAMETER FilePath
        مسار الملف النصي الذي ترغب في إجراء بحث/استبدال عليه.
    .PARAMETER Find
        السلسلة التي ترغب في استبدالها.
    .PARAMETER Replace
        السلسلة التي ترغب في استبدال سلسلتك 'Find' بها.
    .PARAMETER NewFilePath
        إذا كان يجب إنشاء ملف جديد بالسلسلة المستبدلة بدلاً من استبدال
        محتويات الملف الحالي، استخدم هذا البرنامج لإنشاء ملف جديد.
    .PARAMETER Force
        إذا تم استخدام NewFilePath param، سيؤدي استخدام هذا البرنامج إلى استبدال أي ملف
        موجود في NewFilePath.
    #>
    [CmdletBinding(DefaultParameterSetName = 'NewFile')]
    [OutputType()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateScript({Test-Path -Path $_ -PathType 'Leaf'})]
        [string[]]$FilePath,
        [Parameter(Mandatory = $true)]
        [string]$Find,
        [Parameter()]
        [string]$Replace,
        [Parameter(ParameterSetName = 'NewFile')]
        [ValidateScript({ Test-Path -Path ($_ | Split-Path -Parent) -PathType 'Container' })]
        [string]$NewFilePath,
        [Parameter(ParameterSetName = 'NewFile')]
        [switch]$Force
    )
    begin {
        $Find = [regex]::Escape($Find)
    }
    process {
        try {
            foreach ($File in $FilePath) {
                if ($Replace) {
                    if ($NewFilePath) {
                        if ((Test-Path -Path $NewFilePath -PathType 'Leaf') -and $Force.IsPresent) {
                            Remove-Item -Path $NewFilePath -Force
                            (Get-Content $File) -replace $Find, $Replace | Add-Content -Path $NewFilePath -Force
                        } elseif ((Test-Path -Path $NewFilePath -PathType 'Leaf') -and !$Force.IsPresent) {
                            Write-Warning "The file at '$NewFilePath' already exists and the -Force param was not used"
                        } else {
                            (Get-Content $File) -replace $Find, $Replace | Add-Content -Path $NewFilePath -Force
                        }
                    } else {
                        (Get-Content $File) -replace $Find, $Replace | Add-Content -Path "$File.tmp" -Force
                        Remove-Item -Path $File
                        Move-Item -Path "$File.tmp" -Destination $File
                    }
                } else {
                    Select-String -Path $File -Pattern $Find
                }
            }
        } catch {
            Write-Error $_.Exception.Message
        }
    }
}

الموارد

لمزيد من المعلومات حول أمر Set-Content، تحقق من Set-Content: الطريقة في PowerShell للكتابة إلى ملف أو الطريقة البديلة لكتابة المحتويات إلى ملف، أمر Out-File.

Source:
https://adamtheautomator.com/powershell-read-text-file/