Bagaimana cara menyampaikan argumen ke skrip PowerShell?

444

Ada sebuah PowerShellskrip bernama itunesForward.ps1yang membuat iTunes mempercepat 30 detik:

$iTunes = New-Object -ComObject iTunes.Application

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

Ini dijalankan dengan perintah baris prompt:

powershell.exe itunesForward.ps1

Apakah mungkin untuk meneruskan argumen dari baris perintah dan menerapkannya dalam skrip alih-alih nilai hardcoded 30 detik?

Boris Pavlovic
sumber

Jawaban:

609

Diuji berfungsi:

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
}

Sebut saja dengan

powershell.exe -file itunesForward.ps1 -step 15
Ocaso Protal
sumber
7
bagaimana jika parameternya berupa string? Apa itu sintaks? apakah itu seperti -langkah '15' atau -langkah "15"
Andrew Gray
7
@Andrew Pertama-tama Anda harus mengubah tipe parameter ke [string]. Jika Anda ingin meneruskan string sebagai parameter, Anda dapat menggunakan salah satu 'atau ". Jika tidak ada spasi (atau tanda kutip) di dalam string Anda bahkan dapat menghilangkan tanda kutip.
Ocaso Protal
68
FYI, untuk menggunakan banyak params, gunakan sintaks ini:param([string]$env,[string]$s3BucketName)
Josh Padnick
3
Tidak ada "-file". Tidak berfungsi untuk saya sampai saya menambahkan ini. Lihat kode lengkap: powershell.exe -file itunesForward.ps1 -langkah 15
Charles
2
@ Charles Terima kasih atas petunjuknya. Anda benar: -filePanggilan tidak ada. Panggilan tanpa mungkin berfungsi dengan Powershell Versi 1.0 tetapi saya tidak dapat mengujinya. Diperbarui jawabannya.
Ocaso Protal
363

Anda juga dapat menggunakan $argsvariabel (seperti parameter posisi):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

maka bisa dipanggil seperti:

powershell.exe -file itunersforward.ps1 15
Emiliano Poggi
sumber
56
Menemukan ini lebih mudah daripada solusi yang diterima, PLUS Anda dapat langsung menggunakan $ args [0] di mana saja dalam skrip (tidak perlu menjadi baris pertama). PS: Tip untuk meneruskan string sebagai argumen: Mereka harus dilampirkan dalam tanda kutip tunggal.
ADTC
26
Baik ini dan solusi yang diterima berfungsi, perbedaan utama adalah ini membaca parameter berdasarkan posisi, sedangkan solusi yang diterima melakukannya dengan nama. Ketika beberapa parameter harus dilewati, melewati nama mungkin lebih bersih.
Florin Dumitrescu
4
bernama params dalam solusi yang diterima juga otomatis mendapatkan bantuan
Pete
3
Jawaban ini mendapatkan begitu banyak perhatian, silakan periksa yang terkait yang jauh lebih lengkap. stackoverflow.com/questions/6359618/…
Emiliano Poggi
15

Panggil Script dari file batch (* .bat) atau 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"


Panggilan dari PowerShell

Powershell Core atau Windows Powershell

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

Script.ps1 - Kode 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
sumber
6

biarkan Powershell menganalisis dan memutuskan tipe data secara
internal menggunakan 'Varian' untuk ini ...
dan umumnya melakukan pekerjaan yang baik ...

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

atau jika Anda harus melewati beberapa parameter

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

Buat skrip PowerShell dengan kode berikut dalam file.

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

Ini membuat skrip dengan parameter path. Ini akan mencantumkan semua tautan simbolik dalam jalur yang disediakan serta target tautan simbolik yang ditentukan.

JDennis
sumber
2

Anda juga dapat mendefinisikan variabel langsung di baris perintah PowerShell dan kemudian menjalankan skrip. Variabel akan didefinisikan di sana juga. Ini membantu saya dalam kasus di mana saya tidak dapat memodifikasi skrip yang ditandatangani.

Contoh:

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

dengan iTunesForward.ps1 sedang

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $stepsize
}
Katak kecil
sumber
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
sumber
Ini berfungsi. \ Create-application-pool.ps1 -site xx_8010 -Aplikasi AplikasiT -dirtestDir -aplikasiPool TestAppPool
Norberto Castellanos