我尝试使用PowerShell进度条,-status参数不像宣传的那样工作(或者我没有错误地阅读文档。
为简单起见,我们假设我有一个集合:
@("red", "green", "blue")
...我有另一种方法可以遍历该集合。但是当它迭代时,处理需要很长时间。所以我想通过在循环中调用progressBar($i, $s)
来为用户提供状态。
有progressBar的代码:
function progressBar ($count, $color) {
Write-Progress -Activity "My Progress Bar" -status "Doing stuff on $color" -percentComplete ($count / $totalItems * 100)
}
对应于:
作者使用此示例:
-status "Found Service $i"
但是当我运行我的脚本时,在"在" - 它一片空白!
我一直认为+在PS中是串联的......但是这样做-status "Doing stuff on " + $color
也失败了!
在发布之前,我读到了这个:
How do I concatenate strings and variables in PowerShell?
...并且使用$($color)
的建议使得cmdlet一起失败。
那么,我怎样才能让整个字符串出现在-status而不是丢弃$ color部分?
谢谢!
=============================================== ====
再次问好你......我在@BenH和@ Persistent13的评论中添加了完整的代码。
$a = @("red", "green", "blue")
$counter = 1
$totalItems = $a.Count
foreach ($color in $a) {
Write-Host $color "`n"
Start-Sleep -s 3
$counter += 1
progressBar $counter, $color
}
function progressBar ($i, $s) {
Write-Progress -Activity "My Progress Bar" -status "Doing stuff on $s" -percentComplete ($i / $totalItems * 100)
}
答案 0 :(得分:2)
这是一个使用代码修改版本较少的工作示例。 有一些问题需要解决。
首先,让我们看看" new"码。
function progressBar ($i, $s,$totalItems) {
Write-Progress -Activity "My Progress Bar" -status "Doing stuff on $s" -percentComplete ($i / $totalItems * 100)
}
$a = @("red", "green", "blue")
$counter = 0
$totalItems = $a.Count
foreach ($color in $a) {
Write-Host $color "`n"
Start-Sleep -s 3
$counter += 1
progressbar -i $counter -s $color -totalItems $totalItems
}
如您所见,状态及其颜色变量已正确显示。
虽然您的原始代码中存在许多错误。
$totalItems
,但通过该函数无法使用它。这不是一个好的做法,因为如果该变量未在另一个脚本中另外定义,它将失败。 -status "Doing stuff on " + $color
-status ("Doing stuff on " + $color)
会在-status "Doing stuff on $color"
期间无法工作。使用双引号字符串$counter
现在,虽然我提供的修改后的代码正在运行,但我还是建议了其他一些改进措施。
另外,因为您使用的是function progressBar ($index,$Name, $Offset) {
$PercentComplete = 0
if ($index -gt 0) { $PercentComplete = $index * $Offset } # Avoid divide by 0 error for first item.
Write-Progress -Activity "My Progress Bar" -status "Doing stuff on $Name" -percentComplete ($PercentComplete)
}
$ColorArray = @("red", "green", "blue")
$Offset = 1 / $ColorArray.Count * 100 # Calculate one time only instead of each iterations of the loop.
# Because you use a counter, i'd use For instead of foreach.
for($i=0;$i -le $ColorArray.Count;$i++) {
$CurrentColor = $ColorArray[$i]
Write-Host $CurrentColor "`n"
Start-Sleep -s 3
progressbar -index $i -Name $CurrentColor -Offset $Offset
}
变量,所以我个人已经去了for循环而不是foreach,所以计数器是嵌入式的,没有额外的声明。
另外,如果你有一个更大的数组,那么直接计算偏移以优化代码是值得的。
Write-host
最后,只是想到我提到它......
如果您不使用-nonewline
开关参数,{{1}}会自动附加新行。也许你想要那里多余的空白行或者可能没有......只是觉得值得一提。
答案 1 :(得分:1)
function progressBar ($Count, $color) {
Write-Progress -Activity "My Progress Bar" -CurrentOperation "Doing stuff on
$color" -percentComplete ($Count / $totalItems * 100)
}
$a = @("red", "green", "blue")
$counter = 0
$totalItems = $a.Count
foreach ($color in $a) {
Write-Host $color "`n"
progressBar -Count $counter -color $color
Start-Sleep -s 3
$counter += 1
}
所以我无法解释为什么-Status
没有显示变量数据。但是回顾一下我所有的进度条,我从未使用它。使用-CurrentOperation
显示栏上的变量内容。你有很多语法错误。