如何将参数传递给PowerShell脚本?


443

有一个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秒值?

Answers:


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”
Andrew Gray

7
@Andrew首先,您必须将参数的类型更改为[string]。如果您随后想要将字符串作为参数传递,则可以使用'"。如果字符串内没有空格(或引号),您甚至可以省略引号。
奥卡索·普罗塔尔(Ocaso Protal)

68
仅供参考,要使用多个参数,请使用以下语法:param([string]$env,[string]$s3BucketName)
Josh Padnick

3
它缺少“-文件”。直到我添加了它,它才对我不起作用。请参阅完整的代码:powershell.exe -file itunesForward.ps1-步骤15
Charles

2
@Charles感谢您的提示。您是对的:-file呼叫中缺少。不带电话可能适用于Powershell 1.0版,但我无法对其进行测试。更新了答案。
奥卡索·普罗塔尔(Ocaso Protal)

362

您还可以使用$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
此解决方案和接受的解决方案都可以工作,主要区别在于它按位置读取参数,而接受的解决方案按名称读取。当需要传递多个参数时,按名称传递可能更简洁。
Florin Dumitrescu 2013年

4
在接受的解决方案中命名的params也会自动填充获取帮助
Pete 2015年

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.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

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
    }

3

使用文件中的以下代码创建一个powershell脚本。

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

这将创建一个带有path参数的脚本。它将列出提供的路径内的所有符号链接以及符号链接的指定目标。


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 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.