PowerShell ProgressBar中的字符串未显示

时间:2017-09-01 20:23:44

标签: powershell

我尝试使用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)
}

对应于:

https://blogs.technet.microsoft.com/heyscriptingguy/2011/01/29/add-a-progress-bar-to-your-powershell-script/

作者使用此示例:

-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)
}

2 个答案:

答案 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
}

Status bar

如您所见,状态及其颜色变量已正确显示。

虽然您的原始代码中存在许多错误。

  1. Powershell是一个解释器,线性地从脚本的顶部到底部。因此,当你想要调用它时,它需要声明它的函数。
  2. 计算器变量应在代码中初始化为0。否则,您的percentComplete将超过100%(4/3 * 100)并生成错误。
  3. 您尝试在函数内部使用$totalItems,但通过该函数无法使用它。这不是一个好的做法,因为如果该变量未在另一个脚本中另外定义,它将失败。
  4. 你的函数参数中有逗号。这不是你如何将参数传递给powershell。
  5. 使用加号完成字符串连接。但是,在传递参数时,需要在括号之间包含它。 -status "Doing stuff on " + $color -status ("Doing stuff on " + $color)会在-status "Doing stuff on $color"期间无法工作。使用双引号字符串$counter
  6. 时,自动扩展功能更简单

    现在,虽然我提供的修改后的代码正在运行,但我还是建议了其他一些改进措施。

    1. 养成从一开始就命名功能参数的习惯。当代码变大时,更容易识别问题
    2. 您无需使用Write-host添加新行字符。这是默认情况下完成的(如果你想要额外的空白行,那很好。)
    3. 您可以使用双引号来包含变量,以便自动扩展,而不是字符串连接。
    4. 另外,因为您使用的是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显示栏上的变量内容。你有很多语法错误。

  • 您的功能声明应位于顶部
  • $ Counter应该从0开始
  • $ Counter + = 1应该是最后一次