2013-04-05 3 views
2

My Script вызывает функцию, которая нуждается параметры из вызова скриптов:Передача параметров сценария к функции в Powershell

function new($args) 
{ 
    if($args.length -lt 8) 
    { 
    Write-Host "Parameter Missing, requires 8 Parameters. Aborting."! 
    Write-Host $args.length 
    break 
    } 
} 

switch ($args[0]) { 
    '--test' { } 
    '--new' { new $args } 
    default { } 
} 

Когда я называю это массив арг не передан функции new :

PS Q:\mles\etl-i_test> .\iprog.ps1 --new 1 2 3 4 5 6 7 
Parameter Missing, requires 8 Parameters. Aborting. ! 
0 

Как передать массив функции в powershell? Или, в частности, массив $ args? Разве масштаб массива $ args не должен быть глобальным?

+0

Попробуйте использовать 'пары (...)' - http://stackoverflow.com/a/12425338/763026 –

ответ

2

Изменить ваши функции, как показано ниже:

function new { param([string[]] $paramargs) 

    if($paramargs.length -lt 8) 
    { 
    Write-Host "Parameter Missing, requires 8 Parameters. Aborting."! 
    Write-Host $paramargs.length 
    break 
    } 
} 

switch ($args[0]) { 
    '--test' { } 
    '--new' { new $args } 
    default { } 
} 

Это позволит избежать неоднозначности переменной $arg из командной строки и параметра $arg (изменено в $paramarg).

+0

Переименование $ args на что-то другое сделало трюк, спасибо! это 'param ([string []]' необходимо? Он работает без. – mles

+0

Ya, 'param ([string []]' не требуется. Я пробовал так и писал так :) – RinoTom

1

Необходимо явно передать $ args из родительской области в область содержимого. $ args в родительской области никогда не отображается в области chlid, потому что область инициализируется с помощью собственных $ args. Сделайте это:

&{get-variable -scope 0} 

и обратите внимание на результаты. Каждая переменная, которую вы видите там, создается локально в новой области, когда область инициализируется, поэтому эти переменные в родительской области не отображаются в новой области. $ args - одна из этих переменных.

+0

Ах интересно. Я не могу перезаписать $ args в функции. – mles

2

$args всегда является частью любой функции. Когда вы вызываете функцию с $args как имя аргумента, все становится довольно запутанным. В вашей функции измените имя на нечто, отличное от $args, и оно должно работать.

function new($arguments) 
{ 

$arguments.Length 
    if($arguments.length -lt 8) 
    { 
    Write-Host "Parameter Missing, requires 8 Parameters. Aborting."! 
    Write-Host $arguments.length 
    break 
    } 
} 

switch ($args[0]) { 
    '--test' { } 
    '--new' { new $args } 
    default { } 
} 
Смежные вопросы