Comment passer un argument à un script PowerShell?

445

Il y a un PowerShellscript nommé itunesForward.ps1qui fait avancer rapidement iTunes de 30 secondes:

$iTunes = New-Object -ComObject iTunes.Application

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

Il est exécuté avec la commande de ligne d'invite:

powershell.exe itunesForward.ps1

Est-il possible de passer un argument à partir de la ligne de commande et de le faire appliquer dans le script au lieu d'une valeur codée en dur de 30 secondes?

Boris Pavlović
la source

Réponses:

610

Testé comme fonctionnant:

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
}

Appelez-le avec

powershell.exe -file itunesForward.ps1 -step 15
Ocaso Protal
la source
7
que faire si le paramètre est une chaîne? Quelle est la syntaxe? serait-ce quelque chose comme -step '15' ou -step "15"
Andrew Gray
7
@Andrew Tout d'abord, vous devez changer le type du paramètre en [string]. Si vous souhaitez ensuite passer une chaîne en paramètre, vous pouvez utiliser soit 'ou ". S'il n'y a pas d'espace (ou de guillemets) à l'intérieur de la chaîne, vous pouvez même omettre les guillemets.
Ocaso Protal
68
Pour info, pour utiliser plusieurs paramètres, utilisez cette syntaxe:param([string]$env,[string]$s3BucketName)
Josh Padnick
3
Il manque "-file". Cela ne fonctionne pas pour moi jusqu'à ce que j'ajoute cela. Voir le code complet: powershell.exe -fichier itunesForward.ps1 -étape 15
Charles
2
@Charles Merci pour l'astuce. Vous avez raison: le -fileest absent de l'appel. L'appel sans pourrait fonctionner avec Powershell version 1.0 mais je ne peux pas le tester. Mis à jour la réponse.
Ocaso Protal
363

Vous pouvez également utiliser une $argsvariable (c'est comme les paramètres de position):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

alors il peut être appelé comme:

powershell.exe -file itunersforward.ps1 15
Emiliano Poggi
la source
56
Vous avez trouvé cela plus facile que la solution acceptée, PLUS vous pouvez utiliser directement $ args [0] n'importe où dans le script (pas besoin d'être en première ligne). PS: Astuce pour passer des chaînes comme arguments: elles doivent être placées entre guillemets simples.
ADTC
26
Cela et la solution acceptée fonctionnent, la principale différence est que cela lit les paramètres par position, tandis que la solution acceptée le fait par son nom. Lorsque plusieurs paramètres doivent être passés, le passage par nom peut être plus propre.
Florin Dumitrescu
4
les paramètres nommés dans la solution acceptée remplissent également automatiquement l'aide
Pete
3
Cette réponse reçoit tellement d'attention, veuillez consulter celle qui est beaucoup plus complète. stackoverflow.com/questions/6359618/…
Emiliano Poggi
15

Script d'appel à partir d'un fichier batch (* .bat) ou 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"


Appel de PowerShell

Powershell Core ou Windows Powershell

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

Script.ps1 - Code de 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
Joma
la source
6

laissez Powershell analyser et décider du type de données
utilise en interne une `` variante '' pour cela ...
et fait généralement du bon travail ...

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

ou si vous devez passer plusieurs paramètres

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

Créez un script PowerShell avec le code suivant dans le fichier.

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

Cela crée un script avec un paramètre de chemin. Il listera tous les liens symboliques dans le chemin fourni ainsi que la cible spécifiée du lien symbolique.

JDennis
la source
2

Vous pouvez également définir une variable directement dans la ligne de commande PowerShell, puis exécuter le script. La variable y sera également définie. Cela m'a aidé dans un cas où je ne pouvais pas modifier un script signé.

Exemple:

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

avec iTunesForward.ps1 étant

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $stepsize
}
Froggy
la source
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
la source
Cela fonctionne. \ Create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos