it-source

PowerShell의 xargs와 동등한 수준은 얼마입니까?

criticalcode 2023. 10. 13. 22:17
반응형

PowerShell의 xargs와 동등한 수준은 얼마입니까?

POSIX 정의 명령어는 표준 입력에서 수신하는 모든 항목을 가져와 자신의 명령줄에서 수신하는 명령어에 명령줄 인수로 전달합니다.예:grep -rn "String" | xargs rm.

PowerShell에 해당하는 기능은 무엇입니까?

다음 질문은 모두 다음과 같습니다.

하지만 정답은 없습니다. 왜냐하면 모든 정답은 다음과 같이 사용하기 때문입니다.ForEach-Object, 한 번에 하나씩 항목을 처리할 것입니다(예:xargs -n1주어진 예제에 대해 원하는 결과를 얻거나 중간 결과를 변수에 저장하여 내 함수 명령줄-fu를 불쾌하게 합니다.

제가 찾은 방법은 두 가지입니다.첫 번째는 아마도 더 관용적인 PowerShell일 것이고, 두 번째는 파이프 기반 정신에 더 충실할 것입니다.xargs.

예를 들어, 우리가 우리의 모든 고양이 사진을 전달하고 싶다고 하자,myapp.exe.

방법 #1: 명령어 대체

$(명령 대체)를 사용하는 것과 유사한 작업을 수행할 수 있습니다.sh명령 문자열에 파이프라인을 포함시킴으로써:

&"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg | Another-Step)

@(...)내부의 명령에서 어레이를 생성하고, PowerShell은 다음으로 전달되는 어레이를 자동으로 확장합니다.&별도의 명령줄 매개 변수로 변환할 수 있습니다.

그러나 전달하려는 명령을 제어할 수 있는 경우에만 작동하기 때문에 질문에 실제로 답하지 않습니다.

방법 #2: 참 배관

하위 표현식을 사용하여 개체를 파이프링한 다음 배열을 배열로 수집한 다음 배열을 최종 명령으로 파이프링함으로써 "이중 파이프라인"을 구성할 수도 있습니다.

,@(Get-ChildItem -Recurse -Filter *.jpg | Another-Step) | %{&"myapp.exe" $_}

@(...)이전과 같이 항목을 배열로 수집하고 배열은 다음을 사용하여 호출되는 최종 명령으로 피핑됩니다.%(ForEach-Object일반적으로 이는 각 항목을 개별적으로 루프합니다. 왜냐하면 파워셸은 파이프에 연결될 때 배열을 자동으로 평평하게 만들기 때문입니다. 하지만 이는 다음과 같이 추가함으로써 방지할 수 있습니다.,오퍼레이터. 더$_그런 다음 통과된 배열을 포함하기 위해 특수 변수가 정규 변수로 사용합니다.

따라서 중요한 것은 수집하려는 파이프라인을 포장하는 것입니다.,@(...), 그 다음엔 파이프로 뭔가를 집어넣습니다.%{...}.

이 필터는 기본적으로 사용해 왔습니다.xargs집행

filter xargs { ($h,$t) = $args; & $h ($t + $_) }

이는 대략 다음과 맞먹습니다.

filter xargs { & $args[0] ($args[1..$args.length] + $_) }

 docker ps -q | xargs docker stop

 gem list | % { $_.split()[0] } | xargs gem uninstall -aIx

전에 이런 문제가 있었습니다.

PowerShell에서는 다음을 사용할 수 있습니다.

docker ps -aq | ForEach-Object { docker rm $_ }

가장 가까이 갈 수 있는 것은 스플랫팅을 사용하는 것이라고 생각합니다.이 예제에서 사용하는foreach: loop:합니다.

function Xargs {
    param(
        $Cmd
    )
    process {
        $args += ,$_
    }
    end {
        & $Cmd @args
    }
}

이제 테스트:

PS> '-c','"print(123)"' | Xargs python
123

이름이 지정된 매개 변수나 플래그에서는 작동하지 않습니다. 순수한 위치 매개 변수만 전달하므로 cmdlet이 아닌 경우에 가장 잘 작동해야 합니다.

그 말은 내가 당신이 노력하는 것을 매우 단념시킨다는 뜻이기도 합니다. '-WhatIf' | Xargs Remove-WholeSystem.

언급URL : https://stackoverflow.com/questions/36428949/whats-the-equivalent-of-xargs-in-powershell

반응형