597 Stimmen

Wie kann ich ein Argument an ein PowerShell-Skript übergeben?

Es gibt ein PowerShell-Skript mit dem Namen itunesForward.ps1, das iTunes um 30 Sekunden vorspulen lässt:

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + 30
}

Es wird mit einer Eingabeaufforderung ausgeführt:

powershell.exe itunesForward.ps1

Ist es möglich, ein Argument von der Befehlszeile zu übergeben und es im Skript anstelle des fest codierten Werts von 30 Sekunden anzuwenden?

795voto

Ocaso Protal Punkte 18326

Getestet als funktionierend:

#Muss die erste Anweisung in Ihrem Skript sein (abgesehen von Kommentaren)
param([Int32]$schritt=30) 

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $schritt
}

Ruf es auf mit

powershell.exe -file itunesForward.ps1 -schritt 15

Syntax für mehrere Parameter (Kommentare sind optional, aber erlaubt):

<#
    Skriptbeschreibung.

    Einige Anmerkungen.
#>
param (
    # Höhe der größten Spalte ohne obere Leiste
    [int]$h = 4000,

    # Name des Ausgabe-Bildes
    [string]$bild = 'out.png'
)

Und ein Beispiel für erweiterte Parameter, z.B. Obligatorisch:

<#
    Skriptbeschreibung.

    Einige Anmerkungen.
#>
param (
    # Höhe der größten Spalte ohne obere Leiste
    [Parameter(Mandatory=$true)]
    [int]$h,

    # Name des Ausgabe-Bildes
    [string]$bild = 'out.png'
)

Write-Host "$bild $h"

Ein Standardwert funktioniert nicht mit einem obligatorischen Parameter. Sie können das =$true für erweiterte Parameter des Typs boolean [Parameter(Obligatorisch)] auslassen.

0 Stimmen

Ich denke, auf diese Weise ist es beim Ausführen der ps1-Datei lesbarer. Vielen Dank.

10 Stimmen

Was ist, wenn der Parameter ein String ist? Wie lautet die Syntax? Wäre es so etwas wie -step '15' oder -step "15"?

10 Stimmen

@Andrew Zuerst müssen Sie den Typ des Parameters in [string] ändern. Wenn Sie dann einen String als Parameter übergeben möchten, können Sie entweder ' oder " verwenden. Wenn innerhalb des Strings kein Leerzeichen (oder Anführungszeichen) vorhanden ist, können Sie die Anführungszeichen sogar weglassen.

439voto

Emiliano Poggi Punkte 23692

Sie können auch die $args Variable verwenden (das ist wie Positionsparameter):

$step = $args[0]

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $step
}

Dann kann es wie folgt aufgerufen werden:

powershell.exe -file itunersforward.ps1 15

66 Stimmen

Fand dies einfacher als die akzeptierte Lösung, ZUSÄTZLICH können Sie $args[0] direkt im Skript verwenden (es ist nicht erforderlich, dass es die erste Zeile ist). PS: Tipp zum Übergeben von Strings als Argumente: Sie müssen in einfachen Anführungszeichen eingeschlossen sein.

37 Stimmen

Beide, diese und die akzeptierte Lösung, funktionieren. Der Hauptunterschied besteht darin, dass diese die Parameter nach Position liest, während die akzeptierte Lösung dies nach Namen tut. Wenn mehrere Parameter übergeben werden müssen, ist das Übergeben nach Namen möglicherweise sauberer.

6 Stimmen

Benannte Parameter in einer akzeptierten Lösung füllen auch automatisch get-help aus

43voto

Joma Punkte 2432

Rufen Sie das Skript aus einer Batchdatei (*.bat) oder CMD auf

_PowerShell Core_

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hallo -Param2 Welt"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "pfad-zum-skript/Script.ps1 -Param1 Hallo -Param2 Welt"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hallo -Param2 Welt"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hallo Welt"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param2 Welt Hallo"

PowerShell

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hallo -Param2 Welt"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "pfad-zum-skript/Script.ps1 -Param1 Hallo -Param2 Welt"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hallo -Param2 Welt"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hallo Welt"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param2 Welt Hallo"

Rufen Sie von PowerShell aus auf

PowerShell Core oder Windows PowerShell

& pfad-zum-skript/Script.ps1 -Param1 Hallo -Param2 Welt
& ./Script.ps1 -Param1 Hallo -Param2 Welt

Script.ps1 - Skriptcode

param(
    [Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$false)]
    [System.String]
    $Param1,

    [Parameter(Mandatory=$True, Position=1, ValueFromPipeline=$false)]
    [System.String]
    $Param2
)

Write-Host $Param1
Write-Host $Param2

0 Stimmen

Wird die Position=0 Einstellung es in einen Positionsparameter anstatt einer Flagge umwandeln?

1 Stimmen

Wenn Sie die Parameter nicht verwenden, müssen Sie korrekte Werte senden, indem Sie die Positionen respektieren. Überprüfen Sie das Update für diese Antwort.

9voto

ZEE Punkte 2477

Lassen Sie PowerShell den Datentyp analysieren und entscheiden. Intern verwendet es dafür einen 'Variant'.

Und im Allgemeinen macht es einen guten Job...

param($x)
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
    $iTunes.PlayerPosition = $iTunes.PlayerPosition + $x
}

Oder wenn Sie mehrere Parameter übergeben müssen:

param($x1, $x2)
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
    $iTunes.PlayerPosition = $iTunes.PlayerPosition + $x1
    $iTunes.  = $x2
}

9voto

# EINSTIEGSPUNKT MAIN()
Param(
    [Parameter(Mandatory=$True)]
    [String] $site,
    [Parameter(Mandatory=$True)]
    [String] $application,
    [Parameter(Mandatory=$True)]
    [String] $dir,
    [Parameter(Mandatory=$True)]
    [String] $applicationPool
)

# Erstelle die Web IIS-Anwendung
function ValidateWebSite ([String] $webSiteName)
{
    $iisWebSite = Get-Website -Name $webSiteName
    if($Null -eq $iisWebSite)
    {
        Write-Error -Message "Fehler: Website-Name: $($webSiteName) existiert nicht."  -Category ObjectNotFound
    }
    else
    {
        return 1
    }
}

# Erhalte den vollständigen Pfad von der IIS-Website
function GetWebSiteDir ([String] $webSiteName)
{
    $iisWebSite = Get-Website -Name $webSiteName
    if($Null -eq $iisWebSite)
    {
        Write-Error -Message "Fehler: Website-Name: $($webSiteName) existiert nicht."  -Category ObjectNotFound
    }
    else
    {
        return $iisWebSite.PhysicalPath
    }
}

# Erstelle Verzeichnis
function CreateDirectory([string]$fullPath)
{
    $existEvaluation = Test-Path $fullPath -PathType Any
    if($existEvaluation -eq $false)
    {
        new-item $fullPath -itemtype directory
    }
    return 1
}

function CreateApplicationWeb
{
    Param(
        [String] $WebSite,
        [String] $WebSitePath,
        [String] $application,
        [String] $applicationPath,
        [String] $applicationPool
        )
    $fullDir = "$($WebSitePath)\$($applicationPath)"
    CreateDirectory($fullDir)
    New-WebApplication -Site $WebSite -Name $application -PhysicalPath $fullDir -ApplicationPool $applicationPool -Force
}

$fullWebSiteDir = GetWebSiteDir($Site)f($null -ne $fullWebSiteDir)
{
    CreateApplicationWeb -WebSite $Site -WebSitePath $fullWebSiteDir -application $application  -applicationPath $dir -applicationPool $applicationPool
}

0 Stimmen

Es funktioniert. \ create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X