2009-10-28 1043 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-TableFormat-Wide,但沒有運氣。原來我以爲像這樣的工作:

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

但是,這只是給了我一個錯誤。

回答

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 

謹防使用`而不是'。在我的鍵盤上(US-English Qwerty佈局),它位於1的左邊。(感謝Koen Zomers)

+1

這實際上工作。但是,如果添加了任何其他值,即$ _。GetValue('InstallDate'),那麼它會混亂。儘管如此感謝您的幫助,但它完成了原來的問題。 – mike 2009-10-29 12:53:48

+0

我在下面添加了一個替代答案,我認爲它可能更好:) – Jaykul 2009-10-29 13:24:45

+7

工程很棒。謹防使用'而不是'。在我的鍵盤上(US-English Qwerty佈局),它位於1. – 2010-07-09 11:41:56

64

這給一試:

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( 「顯示名稱」)返回null一些條目,所以我過濾出來。順便說一句,你很接近這一點:

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

除了在字符串中,如果你需要訪問一個變量的屬性,那就是「計算表達式」,那麼你需要使用的子表達式的語法像這樣:

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

基本上是一個雙引號的字符串在PowerShell將擴大變量,如$_,但不會計算表達式除非您使用此語法把一個子表達式中的表達式:

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

我嘗試了上述兩種建議,格式仍然不是100%。在記事本中,每個換行符都顯示爲一個小方塊(unicode也許?)。在寫字板中一切似乎都很好,但Word抱怨編碼。 使用Foreach {「$($ _。GetValue('DisplayName'))'n」}仍然在任何文件中輸出錯誤的格式。 – mike 2009-10-28 19:23:03

+0

Powershell的默認輸出是Unicode。我將修改該示例以顯示如何以ascii格式保存。 – 2009-10-28 20:31:41

+0

我試過每個編碼選項的out-file,他們都沒有給我正確的結果。我檢查了環境變量$ OutputEncoding,並且一切都產生了US-ASCII。我想我會嘗試一種不同的方法,可能是用python。 – mike 2009-10-29 12:47:42

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

這是問題的正確答案。這應該是被接受的答案。 – 2015-07-12 22:51:47

6

最終,你試圖做的與每個之間的EXTRA空白行是有點令人困惑:)

我認爲你真正想要做的是使用Get-ItemProperty。缺失值時會出錯,但您可以用-ErrorAction 0將它們禁用或僅將它們留作提醒。由於註冊表提供程序返回了額外的屬性,因此您需要使用與Get-Properties相同的屬性的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 2009-10-29 15:24:59

+0

@mike,你應該把這個作爲答案,對吧? – Jaykul 2012-06-13 04:42:16

4

,我傾向於使用,主要是因爲它的簡單,我沒有多想,作爲下面使用Write-Output選項。寫輸出將在您的字符串中放入一個EOL標記,您可以簡單地輸出完成的字符串。

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

或者,你也可以只用寫輸出生成整個字符串,然後推完串入Out-File

相關問題