함수에 매개 변수를 전달하는 방법?


11

PS 스크립트에서 SVN 작업 복사본을 처리해야하지만 인수를 함수에 전달하는 데 문제가 있습니다. 내가 가진 것은 다음과 같습니다.

function foo($arg1, $arg2)
{
  echo $arg1
  echo $arg2.FullName
}

echo "0: $($args[0])"
echo "1: $($args[1])"
$items = get-childitem $args[1] 
$items | foreach-object -process {foo $args[0] $_}

내가 전달하려는 $arg[0]$arg1foo, 및 $arg[1]$arg2. 그러나 어떤 이유로 든 $arg1항상 비어있는 경우 작동하지 않습니다 .

PS C:\Users\sbi> .\test.ps1 blah .\Dropbox
0: blah
1: .\Dropbox
C:\Users\sbi\Dropbox\Photos
C:\Users\sbi\Dropbox\Public
C:\Users\sbi\Dropbox\sbi
PS C:\Users\sbi>

참고 :"blah" 매개 변수로 전달되지 않습니다 $arg1.

나는 이것이 엄청나게 간단하다는 것을 절대적으로 확신합니다 (방금 PS를 시작하여 여전히 어색한 느낌이 들었습니다). 그러나 나는 지금 1 시간 이상 이것에 대해 머리를 부딪 쳤으며 아무것도 찾을 수 없었습니다.

답변:


2

$arg[]배열은 내부 잃게 범위에 표시 를 ForEach-객체 .

function foo($arg1, $arg2)
{
  echo $arg1
  echo $arg2.FullName
}

echo "0: $($args[0])"
echo "1: $($args[1])"
$zero = $args[0]
$one = $args[1]
$items = get-childitem $args[1] 
$items | foreach-object {
    echo "inner 0: $($zero)"
    echo "inner 1: $($one)"
}

지금까지 얻은 세 가지 답변 중 하나를 수락 할 수는 있지만 이것이 내가 한 일을 보여주기 때문에이 답변을 선택하겠습니다.
sbi

10

$ args [0]이 foreach-object에서 아무 것도 반환하지 않는 이유는 $ args는 이름이없고 일치하지 않는 매개 변수를 명령에 사용하는 자동 변수이고 foreach-object는 새로운 명령이기 때문입니다. 프로세스 블록에 대해 일치하지 않는 매개 변수가 없으므로 $ args [0]이 널입니다.

도움이 될 수있는 한 가지는 스크립트가 함수와 마찬가지로 매개 변수를 가질 수 있다는 것입니다.

param ($SomeText, $SomePath)
function foo($arg1, $arg2)
{
  echo $arg1
  echo $arg2.FullName
}

echo "0: $SomeText"
echo "1: $SomePath"
$items = get-childitem $SomePath
$items | foreach-object -process {foo $SomeText $_}

매개 변수에서 더 많은 기능을 원하기 시작하면 $ args에서 현재 사용할 수있는 현재 고급 매개 변수까지의 매개 변수 진행에 대해 작성한 블로그 게시물 을 확인하십시오 .


ㅋㅋ 이와 같은 이유는 Foreach-Object와 같은 기본 제공 기능을 사용하여 좋은 foreach 루프 구성을 사용하는 것을 선호합니다.
Trevor Sullivan

그래. 이것은 지금 이해합니다. 젠장, 그건 직관적이지 않은 것 같습니다!
sbi

3

다음과 같이 해보십시오 :

# Use an advanced function
function foo
{
  [CmdletBinding()]
  param (
      [string] $arg1
    , [string] $arg2
  )

  Write-Host -Object $arg1;
  Write-Host -Object $arg2;
}

# Create array of "args" to emulate passing them in from command line.
$args = @('blah', 'c:\test');

echo "0: $($args[0])"
echo "1: $($args[1])"

# Force items to be returned as an array, in case there's only 1 item returned
$items = @(Get-ChildItem -Path $args[1]);
Write-Host -Object "There are $($items.Count) in `$items";

# Iterate over items found in directory
foreach ($item in $items) {
    foo -Arg1 $args[0] -Arg2 $item.FullName
}

"항목을 배열로 반환하도록 강요"는 실제로 추가해야 할 사항입니다. 힌트 주셔서 감사합니다!
sbi

예, 하나의 항목 만 다시 가져 오면 조심해야합니다. 명시 적으로 배열로 캐스트하면 일관된 결과를 얻을 수 있으므로을 사용하여 반복 할 수 있습니다 foreach.
Trevor Sullivan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.