有一个名为
itunesForward.ps1
的 PowerShell 脚本可以使 iTunes 快进 30 秒:
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
$iTunes.PlayerPosition = $iTunes.PlayerPosition + 30
}
它是用提示行命令执行的:
powershell.exe itunesForward.ps1
是否可以从命令行传递参数并将其应用到脚本中,而不是硬编码的 30 秒值?
测试工作正常:
#Must be the first statement in your script (not counting comments)
param([Int32]$step=30)
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
$iTunes.PlayerPosition = $iTunes.PlayerPosition + $step
}
调用它
powershell.exe -file itunesForward.ps1 -step 15
多参数语法(注释是可选的,但允许):
<#
Script description.
Some notes.
#>
param (
# height of largest column without top bar
[int]$h = 4000,
# name of the output image
[string]$image = 'out.png'
)
以及一些高级参数的示例,例如强制:
<#
Script description.
Some notes.
#>
param (
# height of largest column without top bar
[Parameter(Mandatory=$true)]
[int]$h,
# name of the output image
[string]$image = 'out.png'
)
Write-Host "$image $h"
默认值不适用于强制参数。对于布尔类型
=$true
的高级参数,您可以省略 [Parameter(Mandatory)]
。
您还可以使用
$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
从批处理文件(*.bat)或CMD调用脚本
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"
pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello -Param2 World"
pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello World"
pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param2 World Hello"
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.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello -Param2 World"
powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello World"
powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param2 World Hello"
从 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
让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
}
# 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 from 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
}
在文件中使用以下代码创建 PowerShell 脚本。
param([string]$path)
Get-ChildItem $path | Where-Object {$_.LinkType -eq 'SymbolicLink'} | select name, target
这将创建一个带有路径参数的脚本。它将列出所提供路径内的所有符号链接以及符号链接的指定目标。
您也可以直接在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
}
在我的特定用例中,我想从配置文件中访问参数,忽略了
params
,并简单地检查参数的存在(本质上是一个开关)。
我有一个批处理脚本,它运行 ps1 文件,但带有配置文件。加载时
profile.ps1
会输出文本。在某些脚本中,如果不需要,我想禁用该文本的输出。为此,我创建了一些简单的开关,如下例所示。
这是一个非常基本的版本,但如果您愿意,您可以扩展它。使用“静默运行”模式为例...
在我的批处理脚本中:
C:\path\to\pwsh.exe -Command "%~dpn0.ps1" -QuietProfile
PowerShell 脚本(在
profile.ps1
内):
[Boolean]$global:QuietProfile = [Boolean]([Environment]::GetCommandLineArgs() -match "-QuietProfile")
if (-not $global:QuietProfile) {
Write-Host "I am some text which should not appear when -QuietProfile is passed"
}
默认情况下(如果您刚刚打开 pwsh.exe),则
$global:QuietProfile
值将为 false,您将看到正常的输出。
显然,您可以在命令中传递
-NoProfile
以阻止配置文件被加载,但在某些情况下,您可能希望加载一些有用的函数,但不是全部。
修改后的脚本:
itunesForward.ps1
param (
[int]$seconds = 30 # Default value is 30 seconds if no argument is provided
)
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1) {
$iTunes.PlayerPosition = $iTunes.PlayerPosition + $seconds
}
说明 参数定义:脚本开头的 param 块定义了一个名为 $seconds 的参数。该参数应为整数,如果未提供参数,则默认为 30。 使用参数:更新玩家位置时,脚本使用 $seconds 的值,允许灵活地快进多少秒。 运行脚本 要从命令行传递参数,您可以像这样执行脚本:
powershell.exe -File itunesForward.ps1 -seconds 45
在此示例中,脚本将快进 45 秒。如果您在没有
-seconds
参数的情况下运行脚本,它将默认快进 30 秒。