Saya sedang mengerjakan skrip PowerShell yang menemukan semua file dengan POLA dalam DIREKTORI tertentu, mencetak baris dokumen yang relevan dengan POLA yang disorot, dan kemudian mengganti POLA dengan kata REPLACE yang disediakan, lalu menyimpan file kembali. Jadi itu benar-benar mengedit file.
Kecuali saya tidak bisa mengubah file tersebut, karena Windows mengeluh tentang file tersebut sudah terbuka. Saya mencoba beberapa metode untuk mengatasi ini, tetapi tetap mengalami masalah. Mungkin ada yang bisa membantu:
param(
[string] $pattern = ""
,[string] $replace = ""
,[string] $directory ="."
,[switch] $recurse = $false
,[switch] $caseSensitive = $false)
if($pattern -eq $null -or $pattern -eq "")
{
Write-Error "Please provide a search pattern." ; return
}
if($directory -eq $null -or $directory -eq "")
{
Write-Error "Please provide a directory." ; return
}
if($replace -eq $null -or $replace -eq "")
{
Write-Error "Please provide a string to replace." ; return
}
$regexPattern = $pattern
if($caseSensitive -eq $false) { $regexPattern = "(?i)$regexPattern" }
$regex = New-Object System.Text.RegularExpressions.Regex $regexPattern
function Write-HostAndHighlightPattern([string] $inputText)
{
$index = 0
$length = $inputText.Length
while($index -lt $length)
{
$match = $regex.Match($inputText, $index)
if($match.Success -and $match.Length -gt 0)
{
Write-Host $inputText.SubString($index, $match.Index) -nonewline
Write-Host $match.Value.ToString() -ForegroundColor Red -nonewline
$index = $match.Index + $match.Length
}
else
{
Write-Host $inputText.SubString($index) -nonewline
$index = $inputText.Length
}
}
}
Get-ChildItem $directory -recurse:$recurse |
Select-String -caseSensitive:$caseSensitive -pattern:$pattern |
foreach {
$file = ($directory + $_.FileName)
Write-Host "$($_.FileName)($($_.LineNumber)): " -nonewline
Write-HostAndHighlightPattern $_.Line
%{ Set-Content $file ((Get-Content $file) -replace ([Regex]::Escape("[$pattern]")),"[$replace]")}
Write-Host "`n"
Write-Host "Processed: $($file)"
}
Masalahnya terletak di blok kode terakhir, tepat di panggilan Get-ChildItem. Tentu saja, beberapa kode di blok itu sekarang agak rusak karena saya mencoba memperbaiki masalah lalu berhenti, namun perlu diingat maksud dari bagian skrip tersebut. Saya ingin mendapatkan kontennya, mengganti kata-katanya, lalu menyimpan teks yang diubah kembali ke file tempat saya mendapatkannya.
Bantuan apa pun akan sangat dihargai.