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



Answers

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

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

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

Question

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




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

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



उपर्युक्त केवल एक "केवल एक फ़ाइल" के लिए चलता है, लेकिन आप इसे अपने फ़ोल्डर में एकाधिक फ़ाइलों के लिए भी चला सकते हैं:

Get-ChildItem 'C:yourfile*.xml' -Recurse | ForEach {
     (Get-Content $_ | ForEach  { $_ -replace '[MYID]', 'MyValue' }) |
     Set-Content $_
}



सेट-कंटेंट कमांड के लिए छोटा सुधार। यदि खोजी गई स्ट्रिंग नहीं मिली है तो Set-Content कमांड लक्ष्य फ़ाइल खाली (खाली) होगा।

आप पहले यह सत्यापित कर सकते हैं कि आप जिस स्ट्रिंग को खोज रहे हैं या नहीं। यदि नहीं, तो यह कुछ भी नहीं बदलेगा।

If (select-string -path "c:\Windows\System32\drivers\etc\hosts" -pattern "String to look for") `
    {(Get-Content c:\Windows\System32\drivers\etc\hosts).replace('String to look for', 'String to replace with') | Set-Content c:\Windows\System32\drivers\etc\hosts}
    Else{"Nothing happened"}



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

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 का उपयोग करने का एक और अधिक शानदार तरीका है, लेकिन इससे आपको एक अच्छा प्रारंभिक बिंदु देना चाहिए।




Related



Tags

powershell