Назад | Перейти на главную страницу

Как передать параметры функции?

Мне нужно обработать рабочую копию SVN в сценарии PS, но у меня проблемы с передачей аргументов функциям. Вот что у меня есть:

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] так как $arg1 к foo, и $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 и все еще чувствую себя очень неуклюжим), но я бился об это головой уже больше часа, и я ничего не могу найти.

Причина того, что $ args [0] ничего не возвращает в объекте foreach, заключается в том, что $ args - это автоматическая переменная, которая принимает неименованные, несопоставленные параметры для команды, а объект foreach - это новая команда. Для блока процесса нет несовпадающих параметров, поэтому $ args [0] имеет значение null.

Одна вещь, которая может помочь, - это то, что ваши скрипты могут иметь параметры, как и функции.

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 до текущих расширенных параметров, которые мы можем использовать сейчас.

Попробуйте что-то вроде этого:

# 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
}

В $arg[] кажется, что массив теряет область видимости внутри ForEach-Object.

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)"
}