2017-10-24 4 views
0

Ich habe ein Powershell-Skript, das mehrere Funktionen enthält. Eine der Funktionen sollte Befehlszeilenargumente erhalten. Hier ist ein ähnliches Skript zu dem, was ich tue:Übergeben von CLI-Argumenten an eine Funktion in Powershell

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

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

Also, wenn ich laufen diese:

.\example.ps1 -name anewfolder -foo 

ich die Funktion Beispiel diese Argumente verwenden möchten.

Aufgrund von Scoping hat meine Funktion keine $ Argumente. Ich schreibe Write-Host $ Argumente in die Funktion, um zu überprüfen, und es gibt nichts zurück. Wie kann ich die Elternargumente ziehen, sie in Params übergeben und Beispiel erhalten, um mit meinen Argumenten zu laufen? Oder sollte ich nur die Funktion entfernen und diesen Teil meines Codes im übergeordneten Bereich ausführen?

+0

es auf diese Weise tun, dann würden Sie die gleiche 'param()' auf den Anfang des Skripts und dann rufen Sie die Funktion hinzufügen müssen (wie Sie tun) mit den angegebenen params. – brendan62269

Antwort

2

Wenn Sie Argumente an Ihr Skript übergeben möchten, müssen Sie sie in einem Param() Block wie Ihre Funktion erfassen. Alternativ können Sie mit einem Bereichswähler wie $script:Args auf Skriptargumente zugreifen.

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 

Jetzt wird .\example.ps1 -name anewfolder -foo erfolgreich sein.

0

$args Innerhalb der Funktion ist eine andere Variable als $args im globalen Bereich des Skripts. Eine sehr einfache Art und Weise beliebige Skript Argumente an die Funktion der Weitergabe zu splat$args:

example @args 

Beachten Sie jedoch, dass dies nicht ein sehr sauberer Ansatz ist. Es wäre besser, das Skript ordnungsgemäß zu parametrisieren und selektiv die Parameter zu übergeben, die für die Funktion vorgesehen sind, wie zum Beispiel TheIncorrigible1 vorgeschlagen.

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 
Verwandte Themen