2017-10-24 1 views
0

私はいくつかの関数を含むpowershellスクリプトを持っています。関数の1つがコマンドライン引数を受け取る必要があります。私はこの実行したときにcli引数をpowershellの関数に渡す

$mydocs = [Environment]::GetFolderPath("MyDocuments") 

function example() { 
    param(
    [string]$name = "testfolder", 
    [switch]$foo = $false 
) 
    $newdir = $mydocs + "\" + $name 
    if (!(Test-Path $newdir)) { mkdir $newdir } 
} 
example 

だから::

.\example.ps1 -name anewfolder -foo 

を私はこれらの引数を使用する関数の例をしたいここで私がやっているようなスクリプトです。

スコープのため、私の関数には$ argsがありません。 Write-Host $ argsを関数に入れてチェックし、何も返さない。親argsを取得し、paramsに渡して、引数を指定して実行するにはどうすればよいですか?または、私は関数を削除して、親スコープで自分のコードのこの部分を実行する必要がありますか?

+0

このようにするには、同じ 'param()'セットをスクリプトの先頭に追加して、指定されたparamsを使って(実行中の)関数を呼び出す必要があります。 – brendan62269

答えて

2

スクリプトに引数を渡す場合は、関数のようにParam()ブロックに引数を取り込む必要があります。また、$script:Argsのようなスコープセレクタを使ってスクリプトargsにアクセスすることもできます。

Param([String]$Name,[Switch]$Foo) 

$mydocs = [Environment]::GetFolderPath("MyDocuments") 

function example 
{ 
    param(
    [string]$name, 
    [switch]$foo 
) 
    $newdir = Join-Path $mydocs $name 
    if (!(Test-Path $newdir)) { mkdir $newdir } 
} 
example -Name $Name -Foo 

ここで、.\example.ps1 -name anewfolder -fooが成功します。

0

$argsは、スクリプトのグローバルスコープ内の$argsとは異なる変数です。これは非常にきれいなアプローチではないこと、しかし、

example @args 

注:お使いの関数に任意のスクリプトの引数を渡すのは非常に簡単な方法は、$argssplatにあります。スクリプトを適切にパラメータ化し、関数に行くことを意図したパラメータを選択的に渡す方が良いでしょう。TheIncorrigible1が提案されています。

Param(
    [string]$name, 
    [int]$bar, 
    [switch]$foo 
) 

function example() { 
    Param(
     [string]$name = "testfolder", 
     [switch]$foo 
    ) 

    $newdir = "${mydocs}\${name}" 
    if (!(Test-Path $newdir)) { mkdir $newdir } 
} 

$params = @{} 
if ($PSBoundParameters.ContainsKey('name')) { $params['name'] = $name } 
if ($PSBoundParameters.ContainsKey('foo')) { $params['foo'] = $true } 

example @params 
関連する問題