Как добавить новую строку для вывода команды в PowerShell?



Я Запускаю следующий код с помощью PowerShell, чтобы получить список установки и удаления программ из реестра:



Get-ChildItem -path hklm:softwaremicrosoftwindowscurrentversionuninstall `
| ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") } `
| Out-File addrem.txt


Я хочу, чтобы список был разделен новыми строками для каждой программы. Я пробовал:



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

Get-ChildItem -path hklm:softwaremicrosoftwindowscurrentversionuninstall `
| ForEach-Object {$_.GetValue("DisplayName") } `
| Write-Host -Separator `n

Get-ChildItem -path hklm:softwaremicrosoftwindowscurrentversionuninstall `
| ForEach-Object -Process { $_.GetValue("DisplayName") } `
| foreach($_) { echo $_ `n }


но все это приводит к странному форматированию при выводе на консоль и с тремя квадратными символами после каждой строки при выводе в файл. Я пытался Format-List,Format-Table и Format-Wide не повезло. Первоначально я думал, что что-то вроде этого будет работа:



Get-ChildItem -path hklm:softwaremicrosoftwindowscurrentversionuninstall `
| ForEach-Object -Process { "$_.GetValue("DisplayName") `n" }


но это просто дало мне ошибку.

779   5  

5 ответов:

или просто установите разделитель выходного поля на двойные новые строки, а затем убедитесь, что вы получаете строку при отправке ее в файл:

$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 layout) он расположен слева от 1.
(Переехал сюда из комментариев-Спасибо Koen 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.текстовый файл:

Adobe AIR

Adobe Flash Player 10 ActiveX

...

Примечание: В моей системе GetValue("DisplayName") возвращает null для некоторых записей, поэтому я отфильтровываю их. Кстати, вы были близки с этим:

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

за исключением того, что в строку, если вам нужно получить доступ к свойству переменной, то есть "вычислить выражение", то нужно использовать синтаксис выражения, например:

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

по сути в строка в двойных кавычках PowerShell будет расширять переменные, такие как $_, но он не будет оценивать выражения если вы помещаете выражение в подвыражение, используя следующий синтаксис:

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

в конечном счете, то, что вы пытаетесь сделать с дополнительными пустыми строками между каждым из них, немного сбивает с толку :)

Я думаю, что вы действительно хотите использовать Get-ItemProperty. Вы получите ошибки, когда значения отсутствуют, но вы можете подавить их с помощью -ErrorAction 0 или просто оставить их как напоминание. Поскольку поставщик реестра возвращает дополнительные свойства, вы захотите вставить Select-Object что использует те же свойства, что и Get-Properties.

затем, если вы хотите каждое свойство в строке с пустой строкой между ними, использовать Format-List (в противном случае используйте чтобы получить по одному на строку).

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

Edit: оператор $ () кита фактически создает лучший синтаксис (я всегда забываю об этом). Вы также можете избежать кавычек внутри кавычек так:

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

вариант, который я обычно использую, в основном потому, что это просто, и мне не нужно думать, использует Write-Output как ниже. Write-Output поместит маркер EOL в строку для вас, и вы можете просто вывести готовую строку.

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

кроме того, вы также можете просто построить всю строку с помощью Write-Output, а затем нажать готовую строку в Out-File.

Comments

    Ничего не найдено.