当前位置: 首页 > 知识库问答 >
问题:

PowerShell ProgressBar中的字符串不显示

符棋
2023-03-14

我正在尝试使用PowerShell进度条,但-status参数未按公布的方式工作(或者我错误地阅读了文档)。

为了简单起见,假设我有一个集合:

@("red", "green", "blue")

...我有另一种方法可以迭代这个集合。但是当它迭代时,处理需要很长时间。所以我想通过在循环中调用进步栏($i,$s)来给用户状态。

这是进步的代码。

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中的连接。。。但是这样做-状态“在“$color上做东西”也失败了!

在发布之前,我读了这个:

如何在PowerShell中连接字符串和变量?

... 使用$($color)的建议会使cmdlet一起失败。

那么,我怎样才能让我的整个字符串显示在状态中,而不是删除$颜色部分?

谢谢!

===================================================

你好再次...我将在下面的@BenH和@Peristent13的注释中添加完整的代码。

$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个答案

乜钱明
2023-03-14
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
}

所以我无法解释为什么-State没有显示变量中的数据。但是回顾我所有的进度条,我从未使用过它。使用-MONTOP显示条形图上的变量内容。你有一些语法错误。

  • 你的函数声明应该在顶部
  • $计数器应该从0开始
  • $计数器=1应该是最后
谭京
2023-03-14

下面是一个使用较少修改版本的代码的工作示例。有一些问题需要解决。

首先,让我们看看“新”代码。

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
}

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

但是在您的原始代码中有一些错误。

  1. Powershell是一个解释器,在脚本的上下都是线性的。因此,当您想要调用它时,需要声明它的函数
  2. 在代码中,计数器变量应初始化为0。否则,您的完成百分比将超过100%(4/3*100)并生成错误
  3. 您尝试在函数中使用$totalItems,但函数无法提供此功能。这不是一个好的实践,因为如果在另一次脚本中没有定义该变量,它将失败
  4. 函数参数中有逗号。这不是向powershell传递参数的方式
  5. 字符串连接是用加号完成的。但是,在传递参数时,需要将其包含在括号中-status“在“$color”上做事情将不起作用,而-status(“在“$color”上做事情)将起作用。更简单的是,当使用双引号字符串时,自动展开功能将显示状态“Doing stuff on$color”

现在,虽然我提供给您的修改后的代码正在运行,但我建议进行一些其他改进。

  1. 从一开始就养成命名函数参数的习惯。当代码变大时,识别问题要容易得多
  2. 不需要使用Write host添加新行字符。这是默认情况下完成的(如果您想要额外的空行,那就好了。)
  3. 您可以使用双引号来包含变量,以使其自动展开,而不是字符串串联

另外,因为您使用的是$counter变量,所以我个人选择了for循环而不是foreach,因此计数器嵌入时不需要额外声明。

另外,如果您有一个更大的数组,那么立即计算偏移量以优化代码是值得的。

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
}

最后,我想我应该提一下<如果不使用-nonewline开关参数,则code>Write host会自动追加新行。也许你想在那里多留一行,也许你不想。。。只是觉得值得一提。

 类似资料:
  • 本文向大家介绍MySQL查询在字符串中的特殊字符之前显示子字符串,包括了MySQL查询在字符串中的特殊字符之前显示子字符串的使用技巧和注意事项,需要的朋友参考一下 在MySQL中为此使用LOCATE()和SUBSTRING()方法。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 输出结果 这将产生以下输出- 以下是在子字符串中的特殊字符之前显示子

  • 问题内容: 上面的代码片段中的代码产生以下输出。 a =’Hello’和b =’Hello’的长度分别为6和6,equals()为false 虽然两者的价值,并在控制台上显示的是,回报。怎么样? 问题答案: 和是 不是 可打印字符。它们都是控制字符,它们决定了文本应如何呈现-从左到右或从右到左。 您不会在终端中看到它们,并且它们不应该是等效的字符串。

  • 问题内容: 我想打印一个字符或字符串,例如’-‘n次。 我可以不使用循环就做吗? ..这意味着打印3次,如下所示: 问题答案: Python 2.x: Python 3.x:

  • 我有代码在这里生成一个随机的名字给定音节点击一个动作按钮。但作为字符串currentName生成的名称会显示在TextView中。我需要使视图成为它自己的类吗?我是androidstudio的新手,来自eclipse,所以textviews对我来说也是新手。多谢了。 } 这也是我的activity_main.xml

  • 编辑:我已经删除了用于out.write的for循环,它不是必需的。我在使用字符串数组时使用过它。

  • 问题内容: 非常简单的问题,但是由于某种原因,在谷歌搜索10分钟后,我在任何地方都找不到答案。使用JavaScript打印时如何显示转义符? 例: 给出: 当我要它给: 问题答案: 如果你的目标是 并以字符串文字形式输出它包含的内容,您可以使用: 添加外引号(至少在Chrome的实现中),但是其中的内容是字符串文字(是的,这有点令人困惑)。 接受您提供的内容(在这种情况下为字符串),并返回包含该值