Come passare un argomento a uno script di PowerShell?


445

C'è uno PowerShellscript chiamato itunesForward.ps1che fa avanzare velocemente iTunes di 30 secondi:

$iTunes = New-Object -ComObject iTunes.Application

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

Viene eseguito con il comando prompt line:

powershell.exe itunesForward.ps1

È possibile passare un argomento dalla riga di comando e averlo applicato nello script anziché nel valore di 30 secondi codificato?

Risposte:


610

Testato come funzionante:

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
}

Chiamalo con

powershell.exe -file itunesForward.ps1 -step 15

7
cosa succede se il parametro è una stringa? Qual è la sintassi? sarebbe qualcosa come -step '15' o -step "15"
Andrew Gray

7
@Andrew Prima di tutto devi cambiare il tipo di parametro in [string]. Se si desidera quindi passare una stringa come parametro, è possibile utilizzare 'o ". Se non c'è spazio (o virgolette) all'interno della stringa, puoi persino omettere le virgolette.
Ocaso Protal,

68
Cordiali saluti, per utilizzare più parametri, utilizzare questa sintassi:param([string]$env,[string]$s3BucketName)
Josh Padnick,

3
Manca "-file". Non funziona per me fino a quando non l'ho aggiunto. Vedi il codice completo: powershell.exe -file itunesForward.ps1 -passo 15
Charles

2
@Charles Grazie per il suggerimento. Hai ragione: -filemanca la chiamata. La chiamata senza potrebbe funzionare con Powershell versione 1.0 ma non riesco a provarla. Aggiornato la risposta.
Ocaso Protal,

363

Puoi usare anche la $argsvariabile (è come i parametri di posizione):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

quindi può essere chiamato come:

powershell.exe -file itunersforward.ps1 15

56
Trovato più facile della soluzione accettata, INOLTRE puoi usare direttamente $ args [0] ovunque nello script (non c'è bisogno di essere la prima riga). PS: Suggerimento sul passaggio di stringhe come argomenti: devono essere racchiuse tra virgolette singole.
ADTC

26
Sia questa che la soluzione accettata funzionano, la differenza principale è che questa legge i parametri per posizione, mentre la soluzione accettata lo fa per nome. Quando è necessario passare più parametri, passare per nome potrebbe essere più pulito.
Florin Dumitrescu,

4
i parametri nominati nella soluzione accettata popolano automaticamente anche get-help
Pete

3
Questa risposta sta ottenendo così tanta attenzione, controlla quella correlata che è molto più completa. stackoverflow.com/questions/6359618/…
Emiliano Poggi,

15

Call Script da file batch (* .bat) o CMD

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"

PowerShell

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"


Chiama da PowerShell

Powershell Core o Windows Powershell

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

Script.ps1 - Codice script

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

6

lascia che Powershell analizzi e decida che il tipo di dati
utilizza internamente una "Variante" per questo ...
e generalmente fa un buon lavoro ...

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

o se è necessario passare più parametri

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

3

Creare uno script PowerShell con il seguente codice nel file.

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

Questo crea uno script con un parametro path. Elencherà tutti i simboli simbolici all'interno del percorso fornito e la destinazione specificata del collegamento simbolico.


2

È inoltre possibile definire una variabile direttamente nella riga di comando di PowerShell e quindi eseguire lo script. Anche la variabile verrà definita lì. Questo mi ha aiutato in un caso in cui non potevo modificare uno script firmato.

Esempio:

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

con iTunesForward.ps1 essere

$iTunes = New-Object -ComObject iTunes.Application

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

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
}

Funziona. \ Create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.