كيف يمكنني إضافة السطر إلى إخراج الأمر في باورشيل ؟

StackOverflow https://stackoverflow.com/questions/1639291

  •  08-07-2019
  •  | 
  •  

سؤال

تشغيل التعليمات البرمجية التالية باستخدام 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" }

لكن أعطاني خطأ.

هل كانت مفيدة؟

المحلول

وأو مجرد مجموعة يختلط <لأ href = "https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables؟view=powershell-6#ofs" = "noreferrer"> انتاج الحقل فاصل (OFS) إلى أسطر جديدة مزدوجة، ومن ثم تأكد من الحصول على سلسلة عند إرساله إلى الملف:

$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 .
(منقول هنا من تعليقات - شكرا كوين Zomers)

نصائح أخرى

وتعطي هذه المحاولة:

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

...

ملحوظة: على نظام بلدي، GetValue ( "اسم العرض") إرجاع فارغة لبعض القيود، لذلك أنا تصفية تلك خارج. راجع للشغل، التي كانت قريبة مع هذا:

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

وفيما عدا ذلك ضمن سلسلة، إذا كنت بحاجة إلى الوصول إلى خاصية متغير، وهذا هو "تقييم تعبير"، فأنت بحاجة إلى استخدام بناء جملة التعبير الجزئي مثل ذلك:

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

وأساسا ضمن سلسلة مقتبسة مزدوجة سوف بوويرشيل توسيع المتغيرات مثل $_، لكنها لن تقييم التعبيرات <م> إلا كنت وضعت التعبير ضمن التعبير الجزئي باستخدام بناء الجملة التالي:

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

في نهاية المطاف, ما كنت تحاول القيام به مع الأسطر الفارغة إضافية بين كل واحد مربكة قليلا :)

أعتقد أن ما كنت حقا تريد القيام به هو استخدام الحصول على ItemProperty.سوف تحصل على أخطاء القيم المفقودة ، ولكن يمكنك قمع لهم -ErrorAction 0 أو مجرد ترك لهم والتذكير.لأن التسجيل مزود عوائد إضافية خصائص, سوف تحتاج إلى العصا في حدد الكائن يستخدم نفس الخصائص مثل الحصول على خصائص.

ثم إذا كنت تريد كل مكان الإقامة على الخط مع سطر فارغ بين استخدام شكل قائمة (على خلاف ذلك ، استخدام تنسيق الجدول الحصول على واحد في كل سطر).

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

وأعتقد كان لديك فكرة صحيحة مع المثال الأخير الخاص بك. كنت فقط حصلت على خطأ لأنك كانوا يحاولون وضع علامات الاقتباس داخل سلسلة مقتبسة بالفعل. هذا وسوف إصلاحه:

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" }

والخيار أنني أميل إلى استخدام، لأن معظمهم انها بسيطة وليس لدي للتفكير، وباستخدام <لأ href = "http://technet.microsoft.com/en-us/library/hh849921.aspx "يختلط =" نوفولو "> كتابة والمخرجات على النحو التالي. إرسال والمخرجات سوف يضع علامة EOL في السلسلة بالنسبة لك، ويمكنك ببساطة إخراج السلسلة النهائية.

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

وبدلا من ذلك، يمكن أيضا أن مجرد بناء السلسلة بأكملها باستخدام الكتابة والمخرجات ومن ثم دفع سلسلة النهائية في <لأ href = "http://technet.microsoft.com/en-us/library/hh849882.aspx" يختلط = "نوفولو"> خارج الملف .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top