Jak przekazać argument do skryptu PowerShell?

444

Jest taki PowerShellskrypt, itunesForward.ps1który przyspiesza przewijanie iTunes o 30 sekund:

$iTunes = New-Object -ComObject iTunes.Application

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

Jest wykonywany za pomocą wiersza polecenia:

powershell.exe itunesForward.ps1

Czy można przekazać argument z wiersza poleceń i zastosować go w skrypcie zamiast 30-sekundowej wartości?

Boris Pavlović
źródło

Odpowiedzi:

609

Testowany jako działający:

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
}

Zadzwoń za pomocą

powershell.exe -file itunesForward.ps1 -step 15
Ocaso Protal
źródło
7
co jeśli parametr jest łańcuchem? Jaka jest składnia? czy byłoby to coś w rodzaju -step „15” lub -step „15”
Andrew Gray
7
@Andrew Przede wszystkim musisz zmienić typ parametru na [string]. Jeśli chcesz przekazać ciąg jako parametr, możesz użyć jednego z nich 'lub ". Jeśli w ciągu nie ma spacji (lub cudzysłowów), możesz nawet pominąć cudzysłowy.
Ocaso Protal
68
Aby użyć wielu parametrów, użyj następującej składni:param([string]$env,[string]$s3BucketName)
Josh Padnick
3
Brakuje „-pliku”. Nie działa dla mnie, dopóki nie dodałem tego. Zobacz pełny kod: powershell.exe -plik itunesForward.ps1 -step 15
Charles
2
@Charles Dzięki za podpowiedź. Masz rację: -filebrakuje połączenia. Połączenie bez może działać z Powershell w wersji 1.0, ale nie mogę go przetestować. Zaktualizowałem odpowiedź.
Ocaso Protal
363

Możesz także użyć $argszmiennej (podobnie jak parametry pozycji):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

wtedy można to nazwać:

powershell.exe -file itunersforward.ps1 15
Emiliano Poggi
źródło
56
Znalazłem to łatwiejsze niż zaakceptowane rozwiązanie, PLUS możesz bezpośrednio używać $ args [0] w dowolnym miejscu skryptu (nie musi być pierwszym wierszem). PS: Wskazówka dotycząca przekazywania ciągów jako argumentów: muszą być ujęte w pojedyncze cudzysłowy.
ADTC
26
Zarówno to, jak i zaakceptowane rozwiązanie działają, główna różnica polega na tym, że odczytuje parametry według pozycji, podczas gdy zaakceptowane rozwiązanie robi to według nazwy. Gdy trzeba przekazać wiele parametrów, przekazywanie według nazwy może być czystsze.
Florin Dumitrescu
4
nazwane parametry w zaakceptowanym rozwiązaniu również automatycznie wypełniają get-help
Pete
3
Ta odpowiedź zyskuje tak wiele uwagi, sprawdź pokrewną, która jest o wiele bardziej kompletna. stackoverflow.com/questions/6359618/…
Emiliano Poggi
15

Wywołaj skrypt z pliku wsadowego (* .bat) lub CMD

Rdzeń 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"

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"


Zadzwoń z PowerShell

Powershell Core lub Windows Powershell

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

Script.ps1 - Kod skryptu

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
źródło
6

pozwól Powershellowi przeanalizować i zdecydować, jaki typ danych
Wewnętrznie używa do tego „wariantu”…
i ogólnie robi dobrą robotę…

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

lub jeśli musisz przekazać wiele parametrów

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

Utwórz skrypt PowerShell z następującym kodem w pliku.

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

Spowoduje to utworzenie skryptu z parametrem ścieżki. Wyświetla listę wszystkich dowiązań symbolicznych w ramach podanej ścieżki, a także określony cel dowiązania symbolicznego.

JDennis
źródło
2

Możesz także zdefiniować zmienną bezpośrednio w linii poleceń PowerShell, a następnie wykonać skrypt. Tam również zostanie zdefiniowana zmienna. Pomogło mi to w przypadku, gdy nie mogłem zmodyfikować podpisanego skryptu.

Przykład:

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

z iTunesForward.ps1

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $stepsize
}
Żabka
źródło
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
źródło
Działa. \ Create-application-pool.ps1 -site xx_8010 -aplikacja AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos