2009-10-28 5 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 } 

그러나 콘솔에 출력 할 때 이상한 형식이되고 파일에 출력 할 때 각 줄 다음에 3 개의 정사각형 문자가 표시됩니다. 나는 Format-List, Format-TableFormat-Wide을 사용해 보았습니다. 원래 이런 식으로 생각했습니다 :

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

그러나 그것은 단지 저에게 오류를 줬습니다.

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 

... 

참고 :

답변

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

+0

제가 생각하기에 아마도 다음과 같은 대체 답변을 추가했습니다. – Jaykul

+7

훌륭한 작품입니다. '와 '를 사용하지 않도록주의하십시오. 내 키보드 (US-English Qwerty 레이아웃)에서 1의 왼쪽에 있습니다. –

64

이 시도해 내 시스템에, GetValue ("표시 이름")는 null을 반환 일부 항목, 그래서 나는 그들을 필터링합니다. 당신은, 즉, 변수의 속성에 액세스 "식 평가"해야하는 경우

문자열 내에서 그 제외
ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

는, 다음과 같이 표현식 구문을 사용합니다 : BTW, 당신은이에 가까웠다 :

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

기본적으로 이중 인용 된 문자열 내에서 PowerShell은 $_ 같은 변수를 확장됩니다,하지만 식을 평가하지 않습니다 하지 않는 한이 구문을 사용하여 서브 표현식 내에서 발현을 넣어 :

+0

위의 제안을 모두 시도했지만 서식이 여전히 100 %가 아닙니다. 각 줄 바꿈은 메모장에서 작은 사각형 (유니 코드일까요?)으로 나타납니다. 워드 패드에서는 모든 것이 잘된 것처럼 보이지만 Word는 인코딩에 대해 불평합니다. Foreach { "$ ($ _. GetValue ('DisplayName'))'n"}를 사용하면 모든 파일에서 잘못된 형식이 출력됩니다. – mike

+0

Powershell의 기본 출력은 유니 코드입니다. 이 예제를 수정하여 ascii 형식으로 저장하는 방법을 보여줄 것이다. –

+0

나는 out-file에 대한 모든 인코딩 옵션을 시도했지만 그 중 아무 것도 올바른 결과를주지 못했습니다. 나는 환경 변수 $ OutputEncoding을 검사했고 모든 것이 US-ASCII를 사용했다. 나는 파이썬에서 다른 접근법을 시도 할 것이라고 생각한다. – mike

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" } 
+1

질문에 대한 정답입니다. 이것은 받아 들여진 대답이어야합니다. –

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

+0

@mike, 대답으로 설정해야합니다. 맞습니까? – Jaykul

4

나는 그것이 간단하고 나는 아래 Write-Output를 사용하여 생각하지 않아도 대부분 때문에, 사용하는 경향 옵션. Write-Output은 EOL 마커를 문자열에 넣고 완성 된 문자열을 출력 할 수 있습니다.

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

또는, 당신은 또한 단지 쓰기 출력을 사용하여 전체 문자열을 만들 수 다음 Out-File로 완성 된 문자열을 밀어 넣습니다.

관련 문제