
내가 간단한 것을 가지고 있다고 가정하십시오 test.ps1
:
Write-Host "access input for the 1st time: $input"
Write-Host "access input for the 2nd time: $input"
그럼 내가 할게'foo' | .\test.ps1
출력됩니다:
첫 번째 액세스 입력: foo
두 번째 액세스 입력:
한 번 접속하면 $input
그 값은 사라집니다. 왜?
문서$input이 열거자이기 때문이라고 합니다.
$input은 열거자이므로 해당 속성에 액세스하면 $input을 더 이상 사용할 수 없습니다. $input 속성을 재사용하려면 $input을 다른 변수에 저장할 수 있습니다.
그러나 나는 열거자가 된다는 것이 무엇을 의미하는지 이해하지 못합니다.
내가 아는 한, 항목 목록을 파이프로 연결하면 블록이 없기 때문에 목록이 열거되지 않습니다 process{}
. 예를 들어 이렇게 하면 @(1,2,3) | .\test.ps1
내 코드는 한 번만 실행되고 배열은 단일 개체로 처리됩니다.
첫 번째 액세스 입력: 1 2 3
두 번째 액세스 입력:
그래서 무엇이 열거되고 있는지, 그리고 왜 $input이 열거자인지를 이해하지 못합니다.
답변1
해당 설명의 나머지 부분을 고려하고 확인해 보세요.about_기능_고급그리고about_Functions_Advanced_Methods.
귀하의 예는 그다지 의미가 없습니다. 스크립트를 호출하면 익명 함수로 작동합니다. $input
첫 번째 경우 만 사용하도록 하면 다음 과 같은 일이 발생합니다.
시작, 프로세스 또는 종료 블록이 없는 함수에서 $input 변수는 함수에 대한 모든 입력 모음을 열거합니다.
Write-Host
열거를 수락하고 반복합니다. 따라서 겉보기에는 단일 값만 얻는 것 같습니다. 본질적으로 ".toString()"을 호출합니다.
루프를 사용하면 개별 값을 얻는다는 것을 알 수 있습니다.
$counter = 0;
$input | ForEach-Object {
Write-Host "access input for the $counter time: $_"
$counter = $counter + 1
}
이 기능이 꼭 필요한 경우에는 프로세스 블록을 사용하는 것이 더 나을 것입니다. 이것이 의미하는 바에 대한 자세한 내용은 고급 기능 도움말을 확인하세요.
begin {
$counter = 0
}
process {
Write-Host "access input for the $counter time: $_"
$counter = $counter + 1
}
이 경우 작동 방식이 약간 변경된다는 점을 명심하세요 $input
.
에 따라열거자에 대한 정보적절한 정의를 갖춘 일반 함수 매개변수를 갖는 것은 일반적으로 로 직접 작업하는 것이 좋습니다 $input
.
답변2
파이핑을 통해 '사물 목록'을 반복합니다.목록에 이상foreach-object
.scriptblock
그 내에서 scriptblock
반복된 값을 다음과 같이 함수 호출에 파이프합니다.입력호출당 반환된 출력 값에 따라 예상 값을 가져옵니다.
이 PowerShell 솔루션에는 다음과 같은 스크립트 논리가 포함되어 있습니다.간단한 기능Write-Output
문 블록을 사용하므로 표준, 간편, 기본 코드를 두 번 이상 반복할 필요가 없습니다 .
따라서 블록에 관해서는 특별히 걱정할 필요가 없습니다 process{}
.
파워셸 Test.ps1
스크립트
Function Test {
Write-Output "Access to your mom's: $input"
};
파워셸도트 소스스크립트를 작성하고 호출하세요.
. "$Env:USERPROFILE\Desktop\test.ps1"
@("car","house","bank account") | % { $_ | test }
산출
Access to your mom's: car
Access to your mom's: house
Access to your mom's: bank account
논리 분석
그러나 나는 열거자가 된다는 것이 무엇을 의미하는지 이해하지 못합니다.
게다가 다음과 같이$input
성명아래에서 참조하고 인용하면 입력으로 전달된 입력 값에 대한 자리 표시자가 되어 전달된 값을 열거한다는 의미입니다. $input
스크립트에서 사용하며 입력으로 받은 값이 포함되어 있습니다. 발생한 문제는 모든 값이 해당 메서드별로 하나의 긴 연결된 문자열로 전달되었다는 것입니다.
-
함수에 전달된 모든 입력을 열거하는 열거자를 포함합니다. 변수는
$input
함수 및 스크립트 블록(이름이 지정되지 않은 함수)에만 사용할 수 있습니다.
또한, 당신이 이해하지 못한 다른 진술은 단지 다음과 같습니다it [ $input
]은 호출된 인스턴스에서만 해당 값을 보유합니다.. $input
호출 전후에 값을 가져오는 데 사용할 수 없으며 호출 시 입력으로만 값으로 설정됩니다.
마지막으로 함수 호출에 변수를 설정할 수 있습니다.$input
호출 시 "열거"된 출력을 제공합니다 (예: $var = "jewelry box" | test
). 이는 변수 $input
가 실행되었을 때의 값으로 나중에 호출 외부에서 변수를 사용할 수 있음을 의미합니다 .
기타 잠재적인 보너스 솔루션
## Input piped to script function call
@("car","house","bank account").ForEach( {$_ | test} );
## Uses "$_" as the placeholder to contain the value iterated right to the command no script or function needed
@("car","house","bank account").ForEach( { Write-Output "Access to your mom's: $_" } );
지원 리소스
.
(소스 또는 도트 연산자)- ForEach-객체
기준별칭Foreach-Object의 경우: '
%
' 기호, ForEach - ForEach 메서드