Wie übergebe ich ein Argument an ein PowerShell-Skript?

443

Es gibt ein PowerShellSkript mit dem Namen itunesForward.ps1, mit dem iTunes 30 Sekunden vorspulen kann:

$iTunes = New-Object -ComObject iTunes.Application

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

Es wird mit dem Befehl prompt line ausgeführt:

powershell.exe itunesForward.ps1

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

Boris Pavlović
quelle

Antworten:

609

Als funktionierend getestet:

param([Int32]$step=30) #Must be the first statement in your script

$iTunes = New-Object -ComObject iTunes.Application

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

Nennen Sie es mit

powershell.exe -file itunesForward.ps1 -step 15
Ocaso Protal
quelle
7
Was ist, wenn der Parameter eine Zeichenfolge ist? Wie ist die Syntax? wäre es so etwas wie -step '15' oder -step "15"
Andrew Gray
7
@ Andrew Zuerst müssen Sie den Typ des Parameters in ändern [string]. Wenn Sie dann eine Zeichenfolge als Parameter übergeben möchten, können Sie entweder 'oder verwenden ". Wenn in der Zeichenfolge kein Leerzeichen (oder Anführungszeichen) vorhanden ist, können Sie die Anführungszeichen sogar weglassen.
Ocaso Protal
68
Zu Ihrer Information, um mehrere Parameter zu verwenden, verwenden Sie diese Syntax:param([string]$env,[string]$s3BucketName)
Josh Padnick
3
Es fehlt "-file". Es funktioniert nicht für mich, bis ich dies hinzugefügt habe. Siehe den vollständigen Code: Powershell.exe -Datei iTunesForward.ps1 -Schritt 15
Charles
2
@ Charles Danke für den Hinweis. Sie haben Recht: Das -filefehlt im Anruf. Der Anruf ohne funktioniert möglicherweise mit Powershell Version 1.0, aber ich kann ihn nicht testen. Die Antwort wurde aktualisiert.
Ocaso Protal
362

Sie können auch $argsVariablen verwenden (das entspricht Positionsparametern):

$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
Emiliano Poggi
quelle
56
Fand dies einfacher als die akzeptierte Lösung, PLUS Sie können $ args [0] direkt an einer beliebigen Stelle im Skript verwenden (keine erste Zeile erforderlich). PS: Tipp zum Übergeben von Zeichenfolgen als Argumente: Sie müssen in einfache Anführungszeichen gesetzt werden.
ADTC
26
Sowohl diese als auch die akzeptierte Lösung funktionieren. Der Hauptunterschied besteht darin, dass die Parameter nach Position gelesen werden, während die akzeptierte Lösung dies nach Namen tut. Wenn mehrere Parameter übergeben werden müssen, ist die Übergabe des Namens möglicherweise sauberer.
Florin Dumitrescu
4
benannte Parameter in akzeptierter Lösung auch automatisch füllen Get-Help
Pete
3
Diese Antwort erhält so viel Aufmerksamkeit, bitte schauen Sie sich die entsprechende an, die viel vollständiger ist. stackoverflow.com/questions/6359618/…
Emiliano Poggi
15

Rufen Sie das Skript aus der Batch-Datei (* .bat) oder CMD auf

Powershell Core

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"

Power Shell

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"


Anruf von Powershell

Powershell Core oder Windows Powershell

& path-to-script/Script.ps1 -Param1 Hello -Param2 World
& ./Script.ps1 -Param1 Hello -Param2 World

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
Joma
quelle
6

Lassen Sie Powershell den Datentyp analysieren und entscheiden.
Verwendet intern eine 'Variante' dafür ...
und macht im Allgemeinen 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.<AnyProperty>  = $x2
    }
ZEE
quelle
3

Erstellen Sie ein Powershell-Skript mit dem folgenden Code in der Datei.

param([string]$path)
Get-ChildItem $path | Where-Object {$_.LinkType -eq 'SymbolicLink'} | select name, target

Dadurch wird ein Skript mit einem Pfadparameter erstellt. Es werden alle symbolischen Links innerhalb des angegebenen Pfads sowie das angegebene Ziel des symbolischen Links aufgelistet.

JDennis
quelle
2

Sie können eine Variable auch direkt in der PowerShell-Befehlszeile definieren und dann das Skript ausführen. Dort wird auch die Variable definiert. Dies hat mir in einem Fall geholfen, in dem ich ein signiertes Skript nicht ändern konnte.

Beispiel:

 PS C:\temp> $stepsize = 30
 PS C:\temp> .\itunesForward.ps1

mit iTunesForward.ps1 ist

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $stepsize
}
Froggy
quelle
2
#ENTRY POINT MAIN()
Param(
    [Parameter(Mandatory=$True)]
    [String] $site, 
    [Parameter(Mandatory=$True)]
    [String] $application, 
    [Parameter(Mandatory=$True)]
    [String] $dir,
    [Parameter(Mandatory=$True)]
    [String] $applicationPool
)

#Create Web IIS Application
function ValidateWebSite ([String] $webSiteName)
{
    $iisWebSite = Get-Website -Name $webSiteName
    if($Null -eq $iisWebSite)
    {
        Write-Error -Message "Error: Web Site Name: $($webSiteName) not exists."  -Category ObjectNotFound
    }
    else
    {
        return 1
    }
}

#Get full path form IIS WebSite
function GetWebSiteDir ([String] $webSiteName)
{
 $iisWebSite = Get-Website -Name $webSiteName
  if($Null -eq $iisWebSite)
  {
  Write-Error -Message "Error: Web Site Name: $($webSiteName) not exists."  -Category ObjectNotFound
  }
 else
 {
  return $iisWebSite.PhysicalPath
 }
}

#Create Directory
    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
}
Norberto Castellanos
quelle
Es funktioniert. \ Create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos