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
'programing' 카테고리의 다른 글
Objective-C의 isEqualToString과 동등한 Swift는 무엇입니까? (0) | 2023.04.23 |
---|---|
Bash 셸 스크립트의 모든 인수 전파 (0) | 2023.04.23 |
iOS 및 WatchKit에서 이미지 tintColor를 변경하는 방법 (0) | 2023.04.23 |
UITableView의 셀 하이라이트 색상을 삭제합니다. (0) | 2023.04.23 |
ASP를 강제하는 방법이 있나요?일반 텍스트를 반환하려면 NET Web API를 선택하십시오. (0) | 2023.04.23 |