Як передати аргумент сценарію PowerShell?


444

Існує PowerShellсценарій з назвою itunesForward.ps1, завдяки якому iTunes переходить вперед на 30 секунд:

$iTunes = New-Object -ComObject iTunes.Application

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

Він виконується командою рядкового рядка:

powershell.exe itunesForward.ps1

Чи можна передати аргумент з командного рядка і застосувати його в скрипті замість твердо кодованого значення 30 секунд?

Відповіді:


609

Перевірено як робоче:

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
}

Телефонуйте за допомогою

powershell.exe -file itunesForward.ps1 -step 15

7
що робити, якщо параметр є рядком? Що таке синтаксис? це буде щось на кшталт -step '15' або -step "15"
Ендрю Грей

7
@Andrew Перш за все, вам потрібно змінити тип параметра на [string]. Якщо ви хочете передати рядок як параметр, ви можете використовувати або 'або ". Якщо всередині рядка немає місця (або лапок), ви можете навіть опустити лапки.
Ocaso Protal

68
FYI, щоб скористатися кількома парамами, використовуйте цей синтаксис:param([string]$env,[string]$s3BucketName)
Josh Padnick

3
У ньому відсутнє "-file". Це не працює для мене, поки я не додав це. Дивіться повний код: powershell.exe -файл itunesForward.ps1 -приступ 15
Чарльз

2
@Charles Дякую за підказку. Ви маєте рацію: -fileцього дзвінка відсутнє. Виклик без роботи може працювати з Powershell Версії 1.0, але я не можу його перевірити. Оновлено відповідь.
Окасо Протал

363

Ви також можете використовувати $argsзмінну (це як параметри позиції):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

то це може викликатись так:

powershell.exe -file itunersforward.ps1 15

56
Знайшовши це простіше, ніж прийняте рішення, PLUS ви можете безпосередньо використовувати $ args [0] в будь-якому місці сценарію (не потрібно бути першим рядком). PS: Порада щодо передачі рядків як аргументів: вони повинні бути укладені в окремі лапки.
ADTC

26
І це, і прийняте рішення працюють, головна відмінність полягає в тому, що це зчитує параметри за позицією, тоді як прийняте рішення робить це по імені. Коли потрібно передати кілька параметрів, проходження за іменем може бути більш чистим.
Флорін Думітреску

4
названі парами у прийнятому рішенні також автоматично заповнюють допомогу
Pete

3
Ця відповідь привертає стільки уваги, будь ласка, ознайомтесь із пов’язаною, яка набагато повніше. stackoverflow.com/questions/6359618/…
Еміліано Поггі

15

Сценарій виклику з пакетного файлу (* .bat) або 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"


Телефонуйте з повноважень

Основна або Windows Powershell

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

Script.ps1 - Код сценарію

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 аналізує та вирішує тип даних.
Внутрішньо використовує для цього "Варіант" ...
і, як правило, робить хорошу роботу ...

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

або якщо вам потрібно передати кілька параметрів

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

3

Створіть скрипт powerhell із таким кодом у файлі.

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

Це створює сценарій з параметром шляху. У ньому будуть перераховані всі символьні посилання в межах наданого шляху, а також вказана ціль символічного посилання.


2

Ви також можете визначити змінну безпосередньо в командному рядку PowerShell, а потім виконати сценарій. Змінна буде визначена і там. Це допомогло мені у випадку, коли я не зміг змінити підписаний сценарій.

Приклад:

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

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

Це працює. \ Create-application-pool.ps1 -сайт xx_8010 -приклад AppTest -dirtestDir -applicationPool TestAppPool
Норберто Кастелланос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.