Подтвердить что ты не робот

Как добавить новую строку для вывода команды в 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" }

Но это только что дало мне ошибку.

4b9b3361

Ответ 1

Или просто установите разделитель выходного поля (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

Остерегайтесь использовать ', а не '. На моей клавиатуре (англо-американская раскладка Qwerty) он расположен слева от 1.
(Перенесено сюда из комментариев - спасибо Коену Зомерсу)

Ответ 2

Попробуйте:

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 ( "DisplayName" ) возвращает null для некоторых записей, поэтому я отфильтровываю их. Кстати, вы были близки с этим:

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Я думаю, что у вас была правильная идея с вашим последним примером. У вас возникла ошибка, потому что вы пытались помещать кавычки внутри уже указанной строки. Это исправит это:

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

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

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

Ответ 5

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

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

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