2017-07-23 10 views
7

मेरी मूल कॉन्फ़िग फ़ाइल (web1.config) के अंत में एक नई पंक्ति (लाइन ब्रेक, CRLF) संलग्न कर देता है बिना किसी अतिरिक्त लाइन है और जब नोटपैड में देखा (सभी पात्रों दिखा रहा है) के रूप में दिखता है:सेट सामग्री मेरी फाइल

Move-Item "web1.config" "webtemp.config" 
Get-Content "webtemp.config" | ForEach-Object {$_ -replace "database=myDb;", "database=newDb;"} |Set-Content "web1.config" -Force 
Remove-Item "webtemp.config" 
Write-Output('Settings Changed') 

तो, नई फ़ाइल (web1.config) उत्पन्न देखो:

enter image description here

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.6" /> 
    <httpRuntime targetFramework="4.6" /> 
    </system.web> 
    <appSettings> 
    <add key="myConnectionString" value="server=localhost;database=myDb;uid=myUser;password=myPass;" /> 
    </appSettings> 
</configuration> 

अब, मैं कुछ और जो लगता है कि करने के लिए अपने डेटाबेस नाम बदलने के लिए स्क्रिप्ट लागू करने की आवश्यकता s के रूप में: मैं इस तरह के रूप में अन्य सभी विकल्पों को आज़मा अतिरिक्त लाइन

enter image description here

सूचना फ़ाइल के अंत में (जो पूरी तरह से की जरूरत नहीं है) पर कहा: - बाहर-फ़ाइल API का उपयोग कर - का उपयोग करते हुए। नेट आईओ विधि System.IO.StreamWriter - -ऑनलाइन फ्लैग का उपयोग करके (यह सभी 10 लाइनों को सिंगल लाइन में परिवर्तित करता है) - विभिन्न एन्कोडिंग विकल्पों का उपयोग - \ r \ n से \ r को बदलने की कोशिश की गई (फिर से सेट- सामग्री हमेशा crlf उत्पन्न करती है)

मैं PowerShell v5.1 का उपयोग कर रहा हूं।

+0

मुझे आपको नए आने वालों को मानक सलाह देने की अनुमति दें: यदि कोई उत्तर आपकी समस्या हल करता है, तो कृपया इसके आगे बड़े चेक मार्क (✓) पर क्लिक करके इसे स्वीकार करें और वैकल्पिक रूप से इसे भी वोट दें (अप-वोटिंग के लिए 15 या अधिक प्रतिष्ठा अंक)। यदि आपको अन्य उत्तर उपयोगी मिलते हैं, तो उन्हें वोट दें। स्वीकार करना (जिसके लिए आपको 2 प्रतिष्ठा अंक प्राप्त होंगे) और उप-वोटिंग भविष्य के पाठकों की सहायता करें। कृपया [प्रासंगिक सहायता-केंद्र आलेख] देखें (http://stackoverflow.com/help/someone-answers)। यदि आपके प्रश्न का अभी तक पूरी तरह उत्तर नहीं दिया गया है, तो कृपया प्रतिक्रिया दें या [स्वयं-उत्तर] (http://stackoverflow.com/help/self-answer)। – mklement0

उत्तर

1

मैं इस कभी नहीं देखा है, तो मैंने किया एक त्वरित खोज की और पाया:

set-content adds newlines by default

सुझाव दिया समाधान बाइट्स के लिए अपनी सामग्री सांकेतिक शब्दों में बदलना और फिर -Encoding पैरामीटर के साथ सेट-सामग्री का प्रयोग है।

Set-Content test.txt ([byte[]][char[]] "test") -Encoding Byte 

मैंने इसे स्वयं परीक्षण किया ताकि मैं पुष्टि कर सकूं कि यह काम करता है।

+1

अच्छा खोज/उत्तर +1। बस इसका उल्लेख करने के लिए PowerShell 6.0 पर समान कार्य करता है।लिनक्स/डार्विन पर 0beta4 केवल lf '0A' – LotPings

+0

को जोड़ने से अलग है यह समाधान एक चेतावनी के साथ आता है: यह अनिवार्य रूप से एकल-बाइट आईएसओ -885 9 -1-एन्कोडेड फ़ाइल बनाता है (आईएसओ -885 9 -1 काफी हद तक अनुकूल है, लेकिन पूरी तरह से संगत नहीं है सबसे व्यापक रूप से उपयोग की जाने वाली विरासत विंडोज कोड पेज, विंडोज -1252), जिसका अर्थ है कि (ए) आप एक अलग आउटपुट एन्कोडिंग का चयन नहीं कर सकते हैं और (बी) स्ट्रिंग के साथ समाधान ब्रेक जिसमें वर्ण हैं जो आईएसओ -885 9 का हिस्सा नहीं हैं -1, जैसे कि '€': निम्न आदेश _breaks_, उदाहरण के लिए: 'सेट-सामग्री test.txt ([बाइट []] [char []] "€") - एन्कोडिंग बाइट ' – mklement0

+1

@LotPings: यह समाधान _anything_ को जोड़ता नहीं है, जो बिंदु है (इसके विपरीत, इनपुट_ में पहले से मौजूद किसी भी लाइन ब्रेक को यूनिक्स प्लेटफॉर्म पर केवल एलएफ होने की संभावना है)। हालांकि, जैसा कि कहा गया है, यह समाधान एन्कोडिंग परिप्रेक्ष्य से समस्याग्रस्त है। – mklement0

4

tl; डॉ:

(Get-Content "webtemp.config" | ForEach-Object { 
    $_ -replace "database=myDb;", "database=newDb;" 
}) -join "`n" | Set-Content -NoNewline -Force "web1.config" 

नोट: "`r`n" साथ "`n" बदलें यदि आप (चाहते हैं बल्कि यूनिक्स शैली वामो-केवल लाइन अंत की तुलना में विंडोज शैली CRLF लाइन अंत PowerShell और कई उपयोगिताओं संभाल कर सकते हैं दोनों)।


PSv5 + में, Set-Content-NoNewline स्विच, जो का निर्देश Set-Content प्रत्येक इनपुट वस्तु के बाद एक नई पंक्ति (लाइन ब्रेक) जोड़ने के लिए नहीं का समर्थन करता है। यह Add-Content और Out-File cmdlets पर समान रूप से लागू होता है।

दूसरे शब्दों में: Set-Content -NoNewlineसीधे सब अपने इनपुट वस्तुओं की स्ट्रिंग अभ्यावेदन concatenates:

> 'one', 'two' | Set-Content -NoNewline tmp.txt; Get-Content tmp.txt 
onetwo 

यदि आप Set-Content -NoNewline को गुजर रहे एकल स्ट्रिंग कि पहले से ही एम्बेडेड गया है न्यूलाइन, आप इसका उपयोग कर सकते हैं और वांछित परिणाम प्राप्त कर सकते हैं:

> "one`ntwo" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?" 
one 
two? 

ध्यान दें कि Get-Content -Raw एक पूरे के रूप फ़ाइल पढ़ता है, (चरित्र डिकोडिंग को छोड़ कर) के रूप में है और तथ्य यह है कि ? सीधे दिखाई देता है two का तात्पर्य के बाद उस फ़ाइल नहीं अनुगामी न्यू लाइन है।

आपके मामले में, जब से तुम (-Raw बिना Get-Content के माध्यम से ) एक द्वारा इनपुट लाइनों एक प्रोसेस कर रहे हैं और इसलिए लाइनों (तार) के एक सरणी outputting, आपको पहले एक नई पंक्ति के साथ उन्हें शामिल होना होगा विभाजक - केवल लाइनों के बीच - और परिणाम को Set-Content -NoNewline पर पास करें, जैसा कि शीर्ष पर दिखाया गया है; यहाँ एक सरल उदाहरण है:

> ('one', 'two') -join "`n" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?" 
one 
two? 

'one', 'two' एक दो तत्व स्ट्रिंग सरणी है कि आपके पंक्ति-दर-पंक्ति प्रसंस्करण आदेश के लिए एक स्टैंड में है।

एन्कोडिंग ध्यान दें:

विंडोज PowerShell में, Set-Content आपके सिस्टम की विरासत, एकल-बाइट कोड पेज पर आधारित है, डिफ़ॉल्ट रूप से पैदा करता है "एएनएसआई" -encoded फ़ाइलें।
एन्कोडिंग को स्पष्ट रूप से नियंत्रित करने के लिए, -Encoding पैरामीटर का उपयोग करें।


PSv4- में, एक समाधान का उपयोग करता है .NET फ्रेमवर्क की जरूरत है:

> [System.IO.File]::WriteAllText('tmp.txt', ('one', 'two') -join "`n"); "$(Get-Content -Raw tmp.txt)?" 
one 
two? 

ध्यान दें कि [System.IO.File]::WriteAllText() कोई एन्कोडिंग तर्क के अभाव में,, बीओएम-कम UTF- को चूक 8।
वांछित [System.Text.Encoding] एन्कोडिंग उदाहरण को आवश्यकतानुसार तीसरे तर्क के रूप में पास करें।

संबंधित मुद्दे