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?

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

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

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

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
    }

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.


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
}

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
}

Está funcionando. \ Create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
— Norberto Castellanos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.