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