Як передати аргумент сценарію 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.