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?

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

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

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

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
    }

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.


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
}

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
}

Cela fonctionne. \ Create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.