programing

파워셸에서 각 개체와 각 개체의 차이

bestprogram 2023. 8. 20. 12:17

파워셸에서 각 개체와 각 개체의 차이

사이에 차이가 있습니까?ForEach그리고.ForEach-Object?

이런 작은 코드가 있어요, 잘 작동합니다.

$txt = Get-Content 'C:\temp\000.txt'
$result = foreach ($line in $txt) {$line.replace(".ini","")}
$result | out-file 'c:\temp\001.txt'

하지만 'For Each-Object'를 사용하면 오류가 발생합니다.

$txt = Get-Content 'C:\temp\000.txt'
$result = foreach-object ($line in $txt) {$line.replace(".ini","")}
$result | out-file 'c:\temp\001.txt'

왜? 및 를 사용하여 루프 결과를 출력하는 방법ForEach-Object

목적에 따라 명령어가 다릅니다.ForEach-Object cmdlet은 파이프라인에서 사용되며 $PSItem 또는 $_를 사용하여 다음과 같은 {scriptblock}을(를) 실행하기 위해 현재 개체를 참조합니다.

1..5 | ForEach-Object {$_}

>1
>2
>3
>4
>5

줄의 시작 부분에 매우 유사한 모양의 키워드인 ForEach를 사용할 수도 있습니다.이 경우 다음과 같이 변수 이름을 정의하는 {scriptblock}을(를) 실행할 수 있습니다.

ForEach ($number in 1..5){$number}
>1
>2
>3
>4
>5

여기서 핵심적인 차이점은 명령을 사용하는 위치입니다. 하나는 파이프라인 중간에 사용되는 반면 다른 하나는 자체 파이프라인을 시작합니다.프로덕션 스타일 스크립트에서는 cmdlet 대신 ForEach 키워드를 사용하는 것이 좋습니다.

foreach의 별칭입니다.ForEach-Object하지만 그것은 또한 키워드로 보입니다 (혼란스러운).

foreach ($<item> in $<collection\>){<statement list>}사용 중인 구문은 다음과 같습니다.help about_foreach.

foreach~하듯이ForEach-Object별칭은help ForEach-Object.

키워드foreach각 시스템에 대해 작동합니다.$<item>에서$<collection>에 나타난 바와 같이()조금.

별칭foreach/functionForEach-Object입력으로 수신되는 컬렉션의 각 항목에 대해 작동합니다.

앞의 두 가지 답변이 모두 맞지만, https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/ 에는 다음과 같은 좋은 요약이 있습니다.

ForEach에 입력하는 파이프는 ForEach-Object의 별칭입니다.그러나 줄의 시작 부분에 ForEach를 배치하면 Windows PowerShell 문이 됩니다.

기타 세부 정보:

ForEach 문은 한 번에 하나씩 처리하기 전에 모든 항목을 집합으로 맨 앞에 로드합니다.각 개체의 경우 항목이 파이프라인을 통해 스트리밍되므로 메모리 요구 사항이 낮아지지만 동시에 성능이 저하될 것으로 예상합니다.

그런 다음 몇 가지 성능 측정을 포함하여 다음과 같이 결론을 내립니다.

그래서 당신은 어떤 것을 사용합니까?글쎄요, 답은 "그건 달라요."입니다.ForEach 문 또는 ForEach-Object cmdlet을 사용하여 항목 컬렉션을 반복할 수 있습니다.메모리가 충분하고 최상의 성능을 원하며 파이프라인을 통해 출력을 다른 명령으로 전달하는 데 신경 쓰지 않는 경우 각 명령에 적합합니다.각 개체(별명 % 및 ForEach)는 파이프라인에서 입력을 받습니다.모든 것을 처리하는 것이 느리지만 시작, 프로세스 및 종료 블록의 이점을 제공합니다.또한 파이프라인을 통해 개체를 다른 명령으로 스트리밍할 수 있습니다.마지막으로, 시스템의 요구사항과 기능에 가장 적합한 접근 방식을 사용합니다.

앞서 언급한 기술적 차이 외에도, 완성도를 위해 다음과 같은 몇 가지 실질적 차이가 있습니다(참고).

1.) 파이프라인에서 처리된 항목의 총 개수를 알 수 없습니다.이 경우 먼저 전체 목록을 획득한 다음 각 루프에 대해 수행하도록 선택할 수 있습니다.

예:

$files = gci "c:\fakepath"
$i = 0
foreach ($file in $files) {
    $i++
    Write-Host "$i / $($files.Count) processed"
}

2.) 기존 목록을 사용할 경우foreach매번 스크립트 블록을 호출할 필요가 없기 때문에 루프가 파이프라인 버전보다 빠릅니다. (하지만 작업과 항목 수에 따라 차이는 무시할 수 있습니다.)

예:

$items = 0..100000
Measure-Command { $items | ForEach-Object { $_ } }
# ~500ms on my machine
Measure-Command { foreach ($i in $items) { $i } }
# ~70ms on my machine

언급URL : https://stackoverflow.com/questions/29148462/difference-between-foreach-and-foreach-object-in-powershell