PowerShell에서 Newline to Command 출력을 추가하려면 어떻게합니까?

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

나는 각 프로그램 당 Newlines로 목록을 분리하기를 원합니다. 난 노력 했어:

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 }

그러나 모두 콘솔에 출력 할 때 이상한 형식이 발생하고 파일에 출력 할 때 각 라인 후 3 개의 정사각형 문자가 생깁니다. 나는 시도했다 Format-List, Format-Table, 그리고 Format-Wide 운이 없습니다. 원래, 나는 이와 같은 것이 효과가 있다고 생각했다.

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

그러나 그것은 단지 나에게 오류를 주었다.

도움이 되었습니까?

해결책

또는 그냥 설정하십시오 출력 필드 분리기 (OFS)는 두 배의 NewLines에서 문자열을 파일로 보낼 때 문자열을 얻도록하십시오.

$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)

다른 팁

이것을 시도해보십시오 :

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을 반환하므로 필터링합니다. BTW, 당신은 이것에 가까웠습니다.

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

문자열 내에서 변수의 속성에 액세스 해야하는 경우, 즉 "표현식 평가"라면 Subexpression 구문을 사용해야합니다.

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

본질적으로 이중 인용 문자열 내에서 PowerShell은 다음과 같은 변수를 확장합니다. $_, 그러나 표현을 평가하지는 않습니다 ~하지 않는 한 이 구문을 사용하여 표현식을 하위 표현 내에 넣습니다.

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

궁극적으로, 각각의 여분의 빈 줄로 당신이하려는 일은 약간 혼란 스럽습니다 :)

당신이 정말로하고 싶은 것은 사용하는 것입니다. get-itemproperty. 값이 누락되면 오류가 발생하지만 -ErrorAction 0 또는 알림으로 남겨 두십시오. 레지스트리 제공 업체는 추가 속성을 반환하기 때문에 선택 객체 이는 Get-Properties와 동일한 속성을 사용합니다.

그런 다음 빈 줄 사이의 라인에 각 속성을 원한다면 사용하십시오. 형식 목록 (그렇지 않으면 사용하십시오 형식 테이블 한 줄에 하나를 얻으려면).

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

편집 : Keith의 $ () 연산자는 실제로 더 나은 구문을 만듭니다 (나는 항상 이것에 대해 잊어 버립니다). 당신은 또한 따옴표 내부의 인용문을 그와 같이 탈출 할 수 있습니다.

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

내가 사용하는 옵션은 주로 간단하고 생각할 필요가 없기 때문에 사용하는 것입니다. 쓰기 출력 아래. 쓰기 출력은 EOL 마커를 문자열에 넣고 완성 된 문자열을 간단히 출력 할 수 있습니다.

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

또는 쓰기 출력을 사용하여 전체 문자열을 빌드 한 다음 완성 된 문자열을 파일 아웃.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top