PowerShell betiğine bağımsız değişken nasıl aktarılır?


445

İTunes'u 30 saniye ileri götüren bir PowerShellkomut dosyası var itunesForward.ps1:

$iTunes = New-Object -ComObject iTunes.Application

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

Komut satırı satırı komutuyla yürütülür:

powershell.exe itunesForward.ps1

Komut satırından bir argüman iletmek ve kodun sabit kodlu 30 saniye değeri yerine uygulanmasını sağlamak mümkün mü?

Yanıtlar:


610

Çalışırken test edildi:

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
}

İle ara

powershell.exe -file itunesForward.ps1 -step 15

7
parametre bir dize ise? Sözdizimi nedir? -step '15' veya -step "15" gibi bir şey olur mu
Andrew Gray

7
@Andrew Öncelikle parametrenin türünü değiştirmeniz gerekir [string]. Sonra bir dize geçmek istiyorsanız birini kullanabilirsiniz parametre olarak 'ya ". Dizenin içinde boşluk (veya tırnak işareti) yoksa tırnak işareti bile atlayabilirsiniz.
Ocaso Protal

68
FYI, birden fazla parametre kullanmak için bu sözdizimini kullanın:param([string]$env,[string]$s3BucketName)
Josh Padnick

3
"-File" eksik. Bunu ekleyene kadar benim için çalışmıyor. Kodun tamamını görün: powershell.exe -file itunesForward.ps1 -adım 15
Charles

2
@Charles İpucu için teşekkürler. Haklısın: -fileÇağrıda eksik. Olmadan çağrı Powershell Sürüm 1.0 ile çalışabilir, ancak test edemez. Yanıt güncellendi.
Ocaso Protal

363

Ayrıca $argsdeğişkeni de kullanabilirsiniz (konum parametreleri gibi):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

o zaman şöyle çağrılabilir:

powershell.exe -file itunersforward.ps1 15

56
Bunu kabul edilen çözümden daha kolay bulmuş olan PLUS, komut dosyasında herhangi bir yerde doğrudan $ args [0] kullanabilirsiniz (ilk satır olmasına gerek yoktur). Not: Dizeleri argüman olarak iletme ipucu: Tek tırnak içine alınmalıdır.
ADTC

26
Hem bu hem de kabul edilen çözüm çalışması, ana fark, parametrelerin pozisyona göre okunması, kabul edilen çözümün ismine göre yapılmasıdır. Birden fazla parametrenin geçirilmesi gerektiğinde, adla geçmek daha temiz olabilir.
Florin Dumitrescu

4
kabul edilen çözümde params adlı otomatik yardım alın
Pete

3
Bu cevap çok dikkat çekiyor, lütfen daha eksiksiz olan ilgili cevaba göz atın. stackoverflow.com/questions/6359618/…
Emiliano Poggi

15

Toplu iş dosyasından (* .bat) veya CMD'den Komut Dosyası Ara

Powershell Çekirdeği

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"

Güç kalkanı

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'den çağrı

Powershell Core veya Windows Powershell

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

Script.ps1 - Kod Kodu

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

Powershell'in veri türünü analiz etmesine ve karar vermesine izin verin
Dahili olarak bunun için bir 'Varyant' kullanır ...
ve genellikle iyi bir iş çıkarır ...

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

veya birden fazla parametre geçirmeniz gerekiyorsa

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

3

Dosyada aşağıdaki kodla bir powershell betiği oluşturun.

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

Bu, path parametresine sahip bir komut dosyası oluşturur. Sağlanan yoldaki tüm sembolik bağlantıları ve sembolik bağlantının belirtilen hedefini listeler.


2

Ayrıca bir değişkeni doğrudan PowerShell komut satırında tanımlayabilir ve ardından komut dosyasını yürütebilirsiniz. Değişken orada da tanımlanacaktır. Bu, imzalı bir komut dosyasını değiştiremediğim bir durumda bana yardımcı oldu.

Misal:

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

iTunesForward.ps1 olmak

$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
}

Çalışıyor. \ Create-application-pool.ps1 -site xx_8010 -uygulama AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.