मैं PowerShell वाली फ़ाइल में स्ट्रिंग की हर घटना को कैसे प्रतिस्थापित कर सकता हूं?




(7)

आप इस तरह कुछ कोशिश कर सकते हैं:

$path = "C:\testFile.txt"
$word = "searchword"
$replacement = "ReplacementText"
$text = get-content $path 
$newText = $text -replace $word,$replacement
$newText > $path

PowerShell का उपयोग करके, मैं MyValue साथ किसी दिए गए फ़ाइल में [MYID] की सभी सटीक घटनाओं को प्रतिस्थापित करना चाहता MyValue । ऐसा करने का सबसे आसान तरीका क्या है?


उपयोग करें (वी 3 संस्करण):

(Get-Content c:\temp\test.txt).replace('[MYID]', 'MyValue') | Set-Content c:\temp\test.txt

या वी 2 के लिए:

(Get-Content c:\temp\test.txt) -replace '\[MYID\]', 'MyValue' | Set-Content c:\temp\test.txt

थोड़ा पुराना और अलग, क्योंकि मुझे किसी विशेष फ़ाइल नाम के सभी उदाहरणों में एक निश्चित पंक्ति को बदलने की आवश्यकता थी।

साथ ही, Set-Content लगातार परिणाम नहीं दे रहा था, इसलिए मुझे Out-File का सहारा लेना पड़ा।

नीचे कोड:

$FileName =''
$OldLine = ''
$NewLine = ''
$Drives = Get-PSDrive -PSProvider FileSystem
foreach ($Drive in $Drives) {
    Push-Location $Drive.Root
        Get-ChildItem -Filter "$FileName" -Recurse | ForEach { 
            (Get-Content $_.FullName).Replace($OldLine, $NewLine) | Out-File $_.FullName
        }
    Pop-Location
}

इस PowerShell संस्करण पर मेरे लिए सबसे अच्छा काम किया है:

Major.Minor.Build.Revision

5.1.16299.98


बहुत अधिक खोज करने के बाद मैं एन्कोडिंग को बदलने के बिना ऐसा करने के लिए सबसे सरल रेखा को समझता हूं:

Get-Content path/to/file.ext | out-file -encoding ASCII targetFile.ext

मैं यही उपयोग करता हूं, लेकिन यह बड़ी टेक्स्ट फ़ाइलों पर धीमा है।

get-content $pathToFile | % { $_ -replace $stringToReplace, $replaceWith } | set-content $pathToFile

यदि आप बड़ी टेक्स्ट फ़ाइलों और गति में तारों को प्रतिस्थापित करने जा रहे हैं, तो चिंता है, System.IO.StreamReader और System.IO.StreamWriter का उपयोग करने में देखें।

try
{
   $reader = [System.IO.StreamReader] $pathToFile
   $data = $reader.ReadToEnd()
   $reader.close()
}
finally
{
   if ($reader -ne $null)
   {
       $reader.dispose()
   }
}

$data = $data -replace $stringToReplace, $replaceWith

try
{
   $writer = [System.IO.StreamWriter] $pathToFile
   $writer.write($data)
   $writer.close()
}
finally
{
   if ($writer -ne $null)
   {
       $writer.dispose()
   }
}

(उपरोक्त कोड का परीक्षण नहीं किया गया है।)

दस्तावेज़ में पाठ को बदलने के लिए शायद StreamReader और StreamWriter का उपयोग करने का एक और अधिक शानदार तरीका है, लेकिन इससे आपको एक अच्छा प्रारंभिक बिंदु देना चाहिए।


यह PowerShell में वर्तमान कार्य निर्देशिका का उपयोग कर मेरे लिए काम किया। आपको FullName प्रॉपर्टी का उपयोग करने की आवश्यकता है, या यह PowerShell संस्करण 5 में काम नहीं करेगा। मुझे अपने सभी CSPROJ फाइलों में लक्ष्य .NET फ्रेमवर्क संस्करण बदलने की आवश्यकता है।

gci -Recurse -Filter *.csproj |
% { (get-content "$($_.FullName)")
.Replace('<TargetFramework>net47</TargetFramework>', '<TargetFramework>net462</TargetFramework>') |
 Set-Content "$($_.FullName)"}

(Get-Content file.txt) | 
Foreach-Object {$_ -replace '\[MYID\]','MyValue'}  | 
Out-File file.txt

नोट करें कि चारों ओर कोष्ठक (Get-Content file.txt) आवश्यक है:

कोष्ठक के बिना सामग्री को पढ़ा जाता है, एक समय में एक पंक्ति, और जब तक यह फ़ाइल-फ़ाइल या सेट-सामग्री तक पहुंच जाती है, तब तक पाइपलाइन को बहती है, जो एक ही फाइल को लिखने की कोशिश करती है, लेकिन यह पहले से ही सामग्री प्राप्त करके खुली है और आपको मिलती है एक त्रुटि। कोष्ठक सामग्री को पढ़ने के एक बार (ओपन, रीड और क्लोज़) को पढ़ने का कारण बनता है। केवल तब जब सभी लाइनें पढ़ी गई हैं, वे एक समय में एक पाइप कर रहे हैं और जब वे पाइपलाइन में अंतिम कमांड तक पहुंचते हैं तो उन्हें फ़ाइल में लिखा जा सकता है। यह $ सामग्री = सामग्री के समान है; $ सामग्री | कहा पे ...







powershell