存储参数和变量,并与命令一起使用
问题描述:
我正在重写Write-Progress函数以更好地处理我的脚本并完成此操作我将所有参数连接到一个字符串中,然后尝试在命令上使用它它不工作。存储参数和变量,并与命令一起使用
功能
Function Update-Progress {
Param (
[String] $Activity,
[Bool] $Completed,
[String] $CurrentOperation,
[Int] $ID,
[Int] $ParentID,
[Int] $PercentComplete,
[Int] $SecondsRemaining,
[Int] $SourceID,
[String] $Status
)
If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
$Parameters = New-Object System.Text.StringBuilder
IF (isNull($Activity)) { Write-Error "Activity is Required" } Else { $Null = $Parameters.Append("-Activity `"$Activity`"") }
IF (!(isNull($Completed))) { $Null = $Parameters.Append(" -Completed") }
IF (!(isNull($CurrentOperation))) { $Null = $Parameters.Append(" -CurrentOperation `"$CurrentOperation`"") }
IF (!(isNull($ID))) { $Null = $Parameters.Append(" -ID `"$ID`"") }
IF (!(isNull($ParentID))) { $Null = $Parameters.Append(" -ParentID `"$ParentID`"") }
IF (!(isNull($PercentComplete))) { $Null = $Parameters.Append(" -PercentComplete `"$PercentComplete`"") }
IF (!(isNull($SecondsRemaining))) { $Null = $Parameters.Append(" -SecondsRemaining `"$SecondsRemaining`"") }
IF (!(isNull($SourceID))) { $Null = $Parameters.Append("-SourceID `"$SourceID`"") }
IF (!(isNull($Status))) { $Null = $Parameters.Append(" -Status `"$Status`"") }
"Write-Progress $Parameters"
Write-Progress $Parameters
$htDisplay.WriteProgress.StopWatch.Reset()
$htDisplay.WriteProgress.StopWatch.Start()
}
}
命令调用功能
Update-Progress -ID 1 -Activity "Preloading threads" -Status "Starting Job $($htConfig.MultiThread.Jobs.count)"
错误 - 进度条显示的确切命令
-Activity "Preloading Threads" -ID "1" -Status "Starting Job #"
写主机显示了以下这样的语法是正确的,只需要弄清楚如何处理变量作为所有参数只是活动参数的广告。
Write-Progress -Activity "Preloading threads" -ID "1" -Status "Starting Job 2"
答
好的,感谢这里的其他人,我找到了答案。这是内联扩展,我需要使用哈希表变量。
来源:Inline expansion of powershell variable as cmdlet parameter?
Function Update-Progress {
Param (
[String] $Activity,
[Bool] $Completed,
[String] $CurrentOperation,
[Int] $ID,
[Int] $ParentID,
[Int] $PercentComplete,
[Int] $SecondsRemaining,
[Int] $SourceID,
[String] $Status
)
If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
IF (isNull($Activity)) { Write-Error "Activity is Required" } Else { $Parameters = @{ Activity=$Activity } }
IF (!(isNull($Completed))) { $Parameters += @{ Completed=$Completed } }
IF (!(isNull($CurrentOperation))) { $Parameters += @{ CurrentOperation=$CurrentOperation } }
IF (!(isNull($ID))) { $Parameters += @{ ID=$ID} }
IF (!(isNull($ParentID))) { $Parameters += @{ ParentID=$ParentID } }
IF (!(isNull($PercentComplete))) { $Parameters += @{ PercentComplete=$PercentComplete } }
IF (!(isNull($SecondsRemaining))) { $Parameters += @{ SecondsRemaining=$SecondsRemaining } }
IF (!(isNull($SourceID))) { $Parameters += @{ SourceID=$SourceID } }
IF (!(isNull($Status))) { $Parameters += @{ Status=$Status } }
Write-Progress @Parameters
$htDisplay.WriteProgress.StopWatch.Reset()
$htDisplay.WriteProgress.StopWatch.Start()
}
}
答
做到这一点,我参加的所有参数转换成字符串,然后尝试使用它。但是它是不工作的命令。
这是一个可怕的想法 - 用splatting与$PSBoundParameters
自动变量,而不是 - 它已经包含了你所需要的一切:
Function Update-Progress {
Param (
[String] $Activity,
[Bool] $Completed,
[String] $CurrentOperation,
[Int] $ID,
[Int] $ParentID,
[Int] $PercentComplete,
[Int] $SecondsRemaining,
[Int] $SourceID,
[String] $Status
)
If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
Write-Progress @PSBoundParameters
$htDisplay.WriteProgress.StopWatch.Reset()
$htDisplay.WriteProgress.StopWatch.Start()
}
}
我可能会去一个Switch
而不是Bool
布尔参数。您可以从原来的命令抢确切Param
块:
[System.Management.Automation.ProxyCommand]::GetParamBlock($(Get-Command Write-Progress))
而且随着越来越输入验证结束以及对应于什么Write-Process
预计位置参数:
Function Update-Progress {
param(
[Parameter(Mandatory=$true, Position=0)]
[string]${Activity},
[Parameter(Position=1)]
[ValidateNotNullOrEmpty()]
[string]${Status},
[Parameter(Position=2)]
[ValidateRange(0, 2147483647)]
[int]${Id},
[ValidateRange(-1, 100)]
[int]${PercentComplete},
[int]${SecondsRemaining},
[string]${CurrentOperation},
[ValidateRange(-1, 2147483647)]
[int]${ParentId},
[switch]${Completed},
[int]${SourceId}
)
If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
Write-Progress @PSBoundParameters
$htDisplay.WriteProgress.StopWatch.Reset()
$htDisplay.WriteProgress.StopWatch.Start()
}
}
我将DEF记住这一点,然而,不幸的是我坚持使用PowerShell v1.0这个特定的脚本。 – user1451070