579 votes

Comment puis-je passer un argument à un script PowerShell ?

Il y a un script PowerShell nommé itunesForward.ps1 qui fait avancer 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 une commande de ligne d'invite :

powershell.exe itunesForward.ps1

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

776voto

Ocaso Protal Points 6025

Testé comme fonctionnant :

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

$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

Syntaxe des paramètres multiples (les commentaires sont facultatifs, mais autorisés) :

<#
    Script description.

    Some notes.
#>
param (
    # height of largest column without top bar
    [int]$h = 4000,

    # name of the output image
    [string]$image = 'out.png'
)

Et quelques exemples pour paramètres avancés par exemple Obligatoire :

<#
    Script description.

    Some notes.
#>
param (
    # height of largest column without top bar
    [Parameter(Mandatory=$true)]
    [int]$h,

    # name of the output image
    [string]$image = 'out.png'
)

Write-Host "$image $h"

Une valeur par défaut ne fonctionnera pas avec un paramètre obligatoire. Vous pouvez omettre le =$true pour les paramètres avancés de type booléen [Parameter(Mandatory)] .

0 votes

Je pense que cette façon est plus lisible lors de l'exécution du fichier ps1. Merci.

10 votes

Que faire si le paramètre est une chaîne de caractères ? Quelle est la syntaxe ? Est-ce que ce serait quelque chose comme -step '15' ou -step "15" ?

10 votes

@Andrew Tout d'abord, vous devez changer le type du paramètre en [string] . Si vous souhaitez ensuite passer une chaîne de caractères en tant que paramètre, vous pouvez utiliser l'une des deux méthodes suivantes ' o " . S'il n'y a pas d'espace (ou de guillemets) dans la chaîne, vous pouvez même omettre les guillemets.

428voto

empo Points 12803

Vous pouvez également utiliser le $args variable (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 on peut l'appeler comme ça :

powershell.exe -file itunersforward.ps1 15

65 votes

J'ai 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 la première ligne). PS : Conseil sur le passage de chaînes de caractères comme arguments : Elles doivent être placées entre guillemets simples.

37 votes

Cette solution et la solution acceptée fonctionnent toutes deux, la principale différence étant que cette solution lit les paramètres par position, alors que la solution acceptée le fait par nom. Lorsque plusieurs paramètres doivent être passés, le passage par nom peut être plus propre.

6 votes

Les paramètres nommés dans la solution acceptée remplissent aussi automatiquement le get-help.

42voto

Joma Points 408

Appeler le script depuis un fichier batch (*.bat) ou CMD

_Noyau PowerShell_

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"

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

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

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

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"

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

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

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

Appel depuis PowerShell

PowerShell Core ou Windows PowerShell

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

script.ps1 - script Code

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 votes

Est-ce que le Position=0 le transformer en un paramètre positionnel plutôt qu'en un drapeau ?

1 votes

Si vous n'utilisez pas les noms des paramètres, vous devez envoyer des valeurs correctes en respectant les positions. Consultez la mise à jour pour cette réponse.

9voto

ZEE Points 391

Laissez PowerShell analyser et décider du type de données. Il utilise en interne une "Variante" pour cela.

Et en général, il fait un 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
}

8voto

# 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 from 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
}

0 votes

Il fonctionne . \create -application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X