programing

PowerShell: 명령어 출력 방법

cafebook 2023. 4. 23. 11:28
반응형

PowerShell: 명령어 출력 방법

PowerShell에서 시도한 것은 다음과 같습니다.

alias | select-string Alias

이 동작은 실패한다.Alias확실히 출력에 포함되어 있습니다.이는 실제 출력 문자열이 아닌 어떤 오브젝트에서 select-string이 동작하고 있기 때문입니다.

어떻게 하면 좋을까요?

이 솔루션이 더 쉽고 더 낫다고 생각합니다. 직접 findstr 함수를 사용합니다.

alias | findstr -i Write

grep 워드를 사용하는 에일리어스를 작성할 수도 있습니다.

new-alias grep findstr

당신의 문제는 에일리어스가 에일리어스의 스트림을 방출한다는 것입니다.문자열 스트림이 아닌 정보 객체.이건 네가 원하는 거야

alias | out-string -stream | select-string Alias

또는 함수로서

function grep {
  $input | out-string -stream | select-string $args
}

alias | grep Alias

파이프라인에 있는 것을 처리하지 않는 경우(예를 들어 'alias'를 실행했을 때) 셸은 각 오브젝트에서 ToString() 메서드를 사용하는 것을 인식합니다(또는 ETS 정보에 지정된 출력 형식을 사용합니다).

포맷된 출력(디스플레이 문자열)을 「그립」하고 싶은 경우는, Mike의 어프로치를 채용합니다.이게 도움이 될 때가 분명히 있어요.그러나 PowerShell의 객체 파이프라인 특성을 수용하고 싶다면 다음과 같이 하십시오.먼저 파이프라인을 따라 흐르는 객체의 속성을 확인합니다.

PS> alias | Get-Member


   TypeName: System.Management.Automation.AliasInfo

Name                MemberType     Definition
----                ----------     ----------
Equals              Method         bool Equals(System.Object obj)
GetHashCode         Method         int GetHashCode()
GetType             Method         type GetType()
ToString            Method         string ToString()
<snip>
*Definition*        Property       System.String Definition {get;}
<snip>

Get-Alias(에일리어스)의 출력을 표시할 때 표시되는 헤더인 Definition 속성에 주의해 주세요.다음은 예를 제시하겠습니다.

PS> alias

CommandType     Name           *Definition*
-----------     ----           ----------
Alias           %              ForEach-Object
<snip>

일반적으로 헤더 제목은 속성 이름과 일치하지만 항상 일치하는 것은 아닙니다.이것이 바로 Get-Member를 사용하는 것이 유용한 이유입니다.「스크립트 작성」을 실시할 필요가 있는 것이 표시됩니다.이제 "grep"할 항목이 정의 속성 내용인 경우 이를 고려하십시오.하나의 속성 값을 그리핑하는 대신 각 별칭을 필터링할 수 있습니다.이 속성의 내용을 기준으로 파이프라인에 있는 정보 객체에 정보를 입력합니다. regex를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

PS> alias | Where-Object {$_.Definition -match 'alias'}

CommandType     Name                   Definition
-----------     ----                   ----------
Alias           epal                   Export-Alias
Alias           gal                    Get-Alias
Alias           ipal                   Import-Alias
Alias           nal                    New-Alias
Alias           sal                    Set-Alias

이 예에서는 Where-Object cmdlet을 사용하여 일부 임의 스크립트를 기반으로 개체를 필터링합니다.이 경우 regex 'alias'에 대해 일치하는 Defintion 속성을 기준으로 필터링합니다.해당 필터에 대해 true를 반환하는 개체만 파이프라인에 전파되고 호스트에 표시되도록 포맷될 수 있습니다.

BTW를 입력하는 경우 Where-Object - 'Where' 또는 '?'의 두 가지 별칭 중 하나를 사용할 수 있습니다.예를 들어 다음과 같습니다.

PS> gal | ?{$_.Definition -match '-Item*'}

두 가지 문제가 있습니다.질문에서와 같이 select-string은 "out-string"에서 얻을 수 있는 출력 문자열로 동작해야 합니다.또한 select-string은 파이프로 연결된 문자열에서는 행 단위로 동작하지 않습니다.일반적인 솔루션을 소개합니다.

(alias|out-string) -split "`n" | select-string Write 

제안된 솔루션은 다음과 같은 작업을 수행하는 데 많은 노력이 필요합니다.

Get-Alias -Definition Write*

이것을 시험해 보세요.

PS C:\> ipconfig /displaydns | Select-String -Pattern 'www.yahoo.com' -Context 0,7

>     www.yahoo.com
      ----------------------------------------
>     Record Name . . . . . : www.yahoo.com
      Record Type . . . . . : 5
      Time To Live  . . . . : 27
      Data Length . . . . . : 8
      Section . . . . . . . : Answer
      CNAME Record  . . . . : new-fp-shed.wg1.b.yahoo.com
PS> alias | Where-Object {$_.Definition -match 'alias'}

CommandType     Name                   Definition
-----------     ----                   ----------
Alias           epal                   Export-Alias
Alias           gal                    Get-Alias
Alias           ipal                   Import-Alias
Alias           nal                    New-Alias
Alias           sal                    Set-Alias

PS의 일치와 모순되는 것은 컬럼의 특정 값과 일치하지 않는 필드를 얻는 것과 같습니다.

보다 유연하고 느린 솔루션을 위해 개체의 모든 속성을 일치시킬 수 있습니다.대부분의 경우, 이것은 여러분이 원하는 행동을 하게 할 것이고, 그렇지 않을 때 여러분은 항상 더 구체적으로 말할 수 있습니다.이 원리에 따라 동작하는 GREP 함수를 다음에 나타냅니다.

Function Select-ObjectPropertyValues {
    param(
    [Parameter(Mandatory=$true,Position=0)]
    [String]
    $Pattern,
    [Parameter(ValueFromPipeline)]
    $input)

    $input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output
}

언급URL : https://stackoverflow.com/questions/1485215/powershell-how-to-grep-command-output

반응형