2009-10-28 10 views
49

मैं PowerShell का उपयोग कर ऐड की एक सूची प्राप्त/रजिस्ट्री से प्रोग्राम को निकालने के लिए निम्न कोड चलाएँ:मैं PowerShell में कमांड आउटपुट के लिए एक नई लाइन कैसे जोड़ूं?

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") } ` 
    | Out-File addrem.txt 

मैं चाहता हूँ सूची प्रत्येक कार्यक्रम के अनुसार नई पंक्तियों द्वारा अलग किया जाना है। मैं कोशिश की है:

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") `n } ` 
    | out-file test.txt 

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object {$_.GetValue("DisplayName") } ` 
    | Write-Host -Separator `n 

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { $_.GetValue("DisplayName") } ` 
    | foreach($_) { echo $_ `n } 

लेकिन अजीब स्वरूपण में सभी परिणाम जब प्रत्येक पंक्ति के बाद कंसोल के लिए उत्पादन, और तीन के साथ वर्ग वर्ण जब एक फाइल करने के लिए उत्पादन। मैंने Format-List, Format-Table, और Format-Wide कोई भाग्य के साथ प्रयास किया। मूल रूप से, मैंने सोचा कि ऐसा कुछ काम करेगा:

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

लेकिन उसने मुझे एक त्रुटि दी।

PS> $nl = [Environment]::NewLine 
PS> gci hklm:\software\microsoft\windows\currentversion\uninstall | 
     ForEach { $_.GetValue("DisplayName") } | Where {$_} | Sort | 
     Foreach {"$_$nl"} | Out-File addrem.txt -Enc ascii 

यह मेरी addrem.txt फ़ाइल में निम्न पाठ पैदावार:

Adobe AIR 

Adobe Flash Player 10 ActiveX 

... 

नोट:

उत्तर

65

या, बस सेट डबल नई-पंक्तियों के उत्पादन क्षेत्र विभाजक, और उसके बाद सुनिश्चित करें कि आप एक स्ट्रिंग प्राप्त कर सकते दायर करने के लिए भेजें:

$OFS = "`r`n`r`n" 
"$(gci -path hklm:\software\microsoft\windows\currentversion\uninstall | 
    ForEach-Object -Process { write-output $_.GetValue('DisplayName') })" | 
out-file addrem.txt 

'और नहीं' का उपयोग करने के लिए सावधान रहें। मेरे कीबोर्ड (यूएस-अंग्रेज़ी क्वर्टी लेआउट) पर यह 1 के बाईं ओर स्थित है (टिप्पणियों से यहां स्थानांतरित किया गया - धन्यवाद कोएन ज़ोमर)

+1

यह वास्तव में काम किया। लेकिन, यदि कोई अन्य मान जोड़ा जाता है, यानी $ _। GetValue ('InstallDate'), तो यह गड़बड़ हो जाता है। यह मूल प्रश्न को पूरा करता है हालांकि सहायता के लिए धन्यवाद। – mike

+0

मैंने नीचे एक वैकल्पिक उत्तर जोड़ा जो मुझे लगता है कि शायद बेहतर है :) – Jaykul

+7

अच्छा काम करता है। 'और नहीं' का उपयोग करने के लिए सावधान रहें। मेरे कीबोर्ड पर (यूएस-अंग्रेज़ी क्वर्टी लेआउट) यह 1. –

64

इस आजमाएँ अपने सिस्टम पर, getValue ("DisplayName") के लिए अशक्त रिटर्न कुछ प्रविष्टियां, इसलिए मैं उन्हें फ़िल्टर करता हूं।

ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

है कि एक स्ट्रिंग के भीतर छोड़कर, आप जो है, एक चर की संपत्ति का उपयोग "एक अभिव्यक्ति का मूल्यांकन" करने की जरूरत है, तो आप ऐसा तरह उपसूचक सिंटैक्स का उपयोग करने की जरूरत है: Btw, आप इस के साथ करीब थे :

Foreach-Object -Process { "$($_.GetValue('DisplayName'))`r`n" } 

एक डबल उद्धृत स्ट्रिंग के भीतर अनिवार्य रूप से PowerShell $_ की तरह चर का विस्तार होगा, लेकिन यह भाव का मूल्यांकन नहीं होगा जब तक कि आप इस वाक्य रचना का उपयोग कर एक उपसूचक भीतर अभिव्यक्ति डाल:

$(`<Multiple statements can go in here`>). 
+0

मैंने ऊपर दिए गए दोनों सुझावों की कोशिश की और स्वरूपण अभी भी 100% नहीं है। नोटपैड में प्रत्येक न्यूलाइन एक छोटे वर्ग (यूनिकोड शायद?) के रूप में दिखाई देती है। वर्डपैड में सब कुछ ठीक लगता है, लेकिन शब्द एन्कोडिंग के बारे में शिकायत करता है। पूर्वानुमान का उपयोग {"$ ($ _। GetValue ('DisplayName'))' n "} अभी भी किसी भी फ़ाइल में गलत प्रारूप आउटपुट करता है। – mike

+0

पावरहेल के लिए डिफ़ॉल्ट आउटपुट यूनिकोड है। मैं एसीआई प्रारूप में कैसे सहेजना है यह दिखाने के लिए उदाहरण को संशोधित करूंगा। –

+0

मैंने आउट-फाइल के लिए प्रत्येक एन्कोडिंग विकल्प की कोशिश की है और उनमें से कोई भी मुझे सही परिणाम नहीं देता है। मैंने पर्यावरण परिवर्तनीय $ आउटपुट एन्कोडिंग की जांच की और सब कुछ यूएस-एएससीआईआईआई आया। मुझे लगता है कि मैं एक अलग दृष्टिकोण की कोशिश करने जा रहा हूं, शायद पाइथन में। – mike

4

मुझे लगता है कि आपके पिछले उदाहरण के साथ आपका सही विचार था। आपको केवल एक त्रुटि मिली क्योंकि आप पहले से उद्धृत स्ट्रिंग के अंदर उद्धरण डालने की कोशिश कर रहे थे। यह इसे ठीक कर देगा:

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output ($_.GetValue("DisplayName") + "`n") } 

संपादित करें: कीथ के $() ऑपरेटर वास्तव में एक बेहतर वाक्य रचना (मैं हमेशा इस एक के बारे में भूल) पैदा करता है। तुम भी उद्धरण बच सकते हैं अंदर उद्धरण के रूप में इतना:

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output "$($_.GetValue(`"DisplayName`"))`n" } 
+1

का उपयोग करने के लिए यह प्रश्न का सही उत्तर है। यह स्वीकार्य उत्तर होना चाहिए। –

6

आखिरकार, आप प्रत्येक के बीच अतिरिक्त खाली रेखाओं के साथ क्या करने का प्रयास कर रहे हैं थोड़ा उलझन में :)

मुझे लगता है कि आप वास्तव में क्या करना चाहते हैं Get-ItemProperty का उपयोग करें। मान अनुपलब्ध होने पर आपको त्रुटियां मिलेंगी, लेकिन आप उन्हें -ErrorAction 0 से दबा सकते हैं या बस उन्हें अनुस्मारक के रूप में छोड़ सकते हैं।चूंकि रजिस्ट्री प्रदाता अतिरिक्त गुण देता है, तो आप Select-Object में चिपकना चाहते हैं जो गेट-प्रॉपर्टी के समान गुणों का उपयोग करता है।

फिर यदि आप प्रत्येक संपत्ति को रिक्त रेखा वाले रेखा पर चाहते हैं, तो Format-List का उपयोग करें (अन्यथा, प्रति पंक्ति एक प्राप्त करने के लिए Format-Table का उपयोग करें)।

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | 
gp -Name DisplayName, InstallDate | 
select DisplayName, InstallDate | 
fl | out-file addrem.txt 
+0

हां के बाईं ओर स्थित है! मुझे नई लाइनों के साथ गड़बड़ करने की बजाए शुरुआत से ही ऐसा करना चाहिए था। सहायता के लिए धन्यवाद! मैं इसकी प्रशंसा करता हूँ। – mike

+0

@ माइक, आपको इसे एक उत्तर के रूप में सेट करना चाहिए, है ना? – Jaykul

4

विकल्प है कि मैं का उपयोग करते हैं, ज्यादातर क्योंकि यह आसान है और मुझे लगता है कि करने के लिए, जैसा कि नीचे Write-Output उपयोग कर रहा है नहीं है। लिखें-आउटपुट आपके लिए स्ट्रिंग में एक ईओएल मार्कर लगाएगा और आप बस समाप्त स्ट्रिंग आउटपुट कर सकते हैं।

Write-Output $stringThatNeedsEOLMarker | Out-File -FilePath PathToFile -Append 

वैकल्पिक रूप से, आप भी पूरी स्ट्रिंग निर्माण राइट-आउटपुट का उपयोग कर सकते हैं और फिर Out-File में समाप्त स्ट्रिंग धक्का।

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