Мне нужно обработать рабочую копию 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)"
}