¿Cómo pasar un argumento a un script de PowerShell?

444

Hay un PowerShellscript llamado itunesForward.ps1que hace que iTunes avance rápidamente 30 segundos:

$iTunes = New-Object -ComObject iTunes.Application

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

Se ejecuta con el comando de línea de solicitud:

powershell.exe itunesForward.ps1

¿Es posible pasar un argumento desde la línea de comandos y aplicarlo en el script en lugar del valor codificado de 30 segundos?

Boris Pavlović
fuente

Respuestas:

609

Probado como trabajando:

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
}

Llámalo con

powershell.exe -file itunesForward.ps1 -step 15
Ocaso Protal
fuente
77
¿Qué pasa si el parámetro es una cadena? ¿Cuál es la sintaxis? sería algo así como -step '15' o -step "15"
Andrew Gray
77
@Andrew En primer lugar, debe cambiar el tipo de parámetro a [string]. Si luego desea pasar una cadena como parámetro, puede usar 'o ". Si no hay espacio (o comillas) dentro de la cadena, incluso puede omitir las comillas.
Ocaso Protal
68
Para su información, para usar múltiples parámetros, use esta sintaxis: param([string]$env,[string]$s3BucketName)
Josh Padnick
3
Falta el "archivo". No funciona para mí hasta que agregué esto. Vea el código completo: powershell.exe -file itunesForward.ps1 -paso 15
Charles
2
@ Charles Gracias por la pista. Tienes razón: -filefalta la llamada. La llamada sin podría funcionar con Powershell Versión 1.0 pero no puedo probarlo. Se actualizó la respuesta.
Ocaso Protal
363

Puede usar también $argsvariable (que es como los parámetros de posición):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

entonces se puede llamar como:

powershell.exe -file itunersforward.ps1 15
Emiliano Poggi
fuente
56
Encontró esto más fácil que la solución aceptada, ADEMÁS, puede usar directamente $ args [0] en cualquier parte del script (no es necesario que sea la primera línea). PD: Sugerencia para pasar cadenas como argumentos: deben ir entre comillas simples.
ADTC
26
Tanto esta como la solución aceptada funcionan, la principal diferencia es que esto lee los parámetros por posición, mientras que la solución aceptada lo hace por nombre. Cuando se deben pasar varios parámetros, pasar por nombre puede ser más limpio.
Florin Dumitrescu
44
los parámetros nombrados en la solución aceptada también se completan automáticamente con get-help
Pete
3
Esta respuesta está recibiendo tanta atención, consulte la relacionada que es mucho más completa. stackoverflow.com/questions/6359618/…
Emiliano Poggi
15

Llamar script desde archivo por lotes (* .bat) o CMD

Núcleo 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"

Potencia Shell

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"


Llamar desde powershell

Powershell Core o Windows Powershell

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

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

deje que Powershell analice y decida el tipo de datos
Usa internamente una 'Variante' para esto ...
y generalmente hace un buen trabajo ...

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

o si necesita pasar múltiples 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
fuente
3

Cree un script de PowerShell con el siguiente código en el archivo.

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

Esto crea un script con un parámetro de ruta. Enumerará todos los enlaces simbólicos dentro de la ruta proporcionada, así como el objetivo especificado del enlace simbólico.

JDennis
fuente
2

También puede definir una variable directamente en la línea de comando de PowerShell y luego ejecutar el script. La variable se definirá allí también. Esto me ayudó en un caso en el que no pude modificar un script firmado.

Ejemplo:

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

con iTunesForward.ps1 siendo

$iTunes = New-Object -ComObject iTunes.Application

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