2013-04-05 38 views
2

我的腳本調用從腳本調用需要的參數的函數:在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 { } 
} 

當我稱呼它,args數組不移交給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 – 2013-04-05 14:46:03

回答

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 2013-04-05 15:44:20

+0

Ya,'param([string []]'不是必需的。 – RinoTom 2013-04-06 17:41:30

1

您必須顯式將$ args從父範圍傳遞到子範圍。父範圍中的$ args在chlid範圍內永遠不可見,因爲範圍是用它自己的$ args初始化的。這樣做:

&{get-variable -scope 0} 

並注意結果。您看到的每個變量都是在範圍初始化時在新範圍中本地創建的,因此父範圍中的變量在新範圍中不可見。 $ args是其中的一個變量。

+0

啊有趣。我不能覆蓋函數中的$ args。 – mles 2013-04-05 15:43:07

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