Como passar um argumento para um script do PowerShell?

444

Há um PowerShellscript chamado itunesForward.ps1que faz o iTunes avançar 30 segundos:

$iTunes = New-Object -ComObject iTunes.Application

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

É executado com o comando da linha de prompt:

powershell.exe itunesForward.ps1

É possível passar um argumento da linha de comando e aplicá-lo no script em vez do valor codificado de 30 segundos?

Boris Pavlović
fonte

Respostas:

609

Testado como funcionando:

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
}

Ligue com

powershell.exe -file itunesForward.ps1 -step 15
Ocaso Protal
fonte
7
e se o parâmetro for uma string? Qual é a sintaxe? seria algo como -step '15' ou -step "15"
Andrew Gray
7
@ Andrew Antes de tudo, você deve alterar o tipo do parâmetro para [string]. Se você deseja passar uma string como parâmetro, use 'ou ". Se não houver espaço (ou aspas) dentro da string, você pode até omitir as aspas.
Ocaso Protal
68
Para sua informação, para usar vários parâmetros, use esta sintaxe:param([string]$env,[string]$s3BucketName)
Josh Padnick
3
Está faltando "-file". Ele não funciona para mim até que eu adicionei isso. Veja o código completo: powershell.exe -file itunesForward.ps1 -step 15
Charles
2
@ Charles Obrigado pela dica. Você está certo: -fileestá faltando a chamada. A chamada sem pode funcionar com o Powershell versão 1.0, mas não posso testá-lo. Atualizado a resposta.
Ocaso Protal 23/02
363

Você também pode usar $argsvariáveis ​​(como parâmetros de posição):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

então pode ser chamado como:

powershell.exe -file itunersforward.ps1 15
Emiliano Poggi
fonte
56
Achei isso mais fácil do que a solução aceita. Além disso, você pode usar diretamente $ args [0] em qualquer lugar do script (não precisa ser a primeira linha). PS: Dica sobre como passar strings como argumentos: elas devem estar entre aspas simples.
ADTC
26
Tanto esta como a solução aceita funcionam, a principal diferença é que ela lê os parâmetros por posição, enquanto a solução aceita faz pelo nome. Quando vários parâmetros precisam ser passados, a passagem pelo nome pode ser mais limpa.
22613 Florin Dumitrescu
4
params nomeado em solução aceita também auto preenchimento get-ajuda
Pete
3
Esta resposta está recebendo tanta atenção, por favor, verifique a relacionada que é muito mais completa. stackoverflow.com/questions/6359618/…
Emiliano Poggi
15

Script de chamada do arquivo em lotes (* .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"


Chamada do PowerShell

Powershell Core ou Windows Powershell

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

Script.ps1 - Código do 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
fonte
6

deixe o Powershell analisar e decidir o tipo de dados
Internamente usa uma 'Variante' para isso ...
e geralmente faz um bom trabalho ...

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

ou se você precisar passar vários parâmetros

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

Crie um script do PowerShell com o seguinte código no arquivo

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

Isso cria um script com um parâmetro de caminho. Ele listará todas as ligações simbólicas no caminho fornecido, bem como o destino especificado do link simbólico.

JDennis
fonte
2

Você também pode definir uma variável diretamente na linha de comando do PowerShell e executar o script. A variável também será definida lá. Isso me ajudou em um caso em que não consegui modificar um script assinado.

Exemplo:

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

sendo o iTunesForward.ps1

$iTunes = New-Object -ComObject iTunes.Application

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