Как передать аргумент скрипту PowerShell?

445

Есть 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 секунд?

Борис Павлович
источник

Ответы:

611

Проверено как работающее:

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
Ocaso Protal
источник
7
Что делать, если параметр является строкой? Какой синтаксис? это будет что-то вроде -шаг '15' или -шаг "15"
Эндрю Грей
7
@Andrew Прежде всего вы должны изменить тип параметра на [string]. Если вы хотите передать строку в качестве параметра, вы можете использовать либо, 'либо ". Если внутри строки нет пробелов (или кавычек), вы можете даже опустить кавычки.
Ocaso Protal
68
К вашему сведению, чтобы использовать несколько параметров, используйте этот синтаксис:param([string]$env,[string]$s3BucketName)
Джош Падник
3
Отсутствует "-файл". Это не работает для меня, пока я не добавил это. См. Полный код: powershell.exe -file itunesForward.ps1 -шаг 15
Чарльз
2
@Charles Спасибо за подсказку. Вы правы: -fileотсутствует в вызове. Вызов без может работать с Powershell версии 1.0, но я не могу его проверить. Обновил ответ.
Ocaso Protal
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
Нашел это проще, чем принятое решение, плюс вы можете напрямую использовать $ args [0] в любом месте скрипта (нет необходимости в первой строке). PS: Совет по передаче строк в качестве аргументов: они должны быть заключены в одинарные кавычки.
ADTC
26
И это, и принятое решение работают, главное отличие состоит в том, что они считывают параметры по позиции, в то время как принятое решение делает это по имени. Когда необходимо передать несколько параметров, передача по имени может быть более чистой.
Флорин Думитреску
4
именованные параметры в принятом решении также автоматически заполняются get-help
Пит
3
Этот ответ привлекает так много внимания, пожалуйста, проверьте связанный, который является более полным. stackoverflow.com/questions/6359618/…
Эмилиано Поджи
15

Сценарий вызова из пакетного файла (* .bat) или CMD

Ядро 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"


Звонок из powershell

Powershell Core или 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
Joma
источник
6

пусть Powershell проанализирует и решит, что тип данных
внутренне использует для этого вариант «Variant»
и, в общем, делает хорошую работу ...

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
    }
ZEE
источник
3

Создайте скрипт powershell со следующим кодом в файле.

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

Это создает скрипт с параметром пути. В нем будут перечислены все символические ссылки в указанном пути, а также указана цель символической ссылки.

JDennis
источник
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 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Норберто Кастелланос