2017-09-01 67 views
0

我試圖使用PowerShell的進度條和宣傳的-status參數不工作(或我不正確地閱讀文檔。字符串在PowerShell中進度未顯示

爲了簡單起見,假設我有一個集合:

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

...我有另一個它通過收集迭代但是,當它遍歷,處理需要很長的時間的方法所以,我想通過把給地位給用戶。在迴路中撥打progressBar($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連接...但是這樣做-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) 
} 
+1

沒有看到您的完整代碼,這似乎是一個範圍界定問題。你可以發佈你的代碼或一個最小可行的例子來證明這個問題嗎? – Persistent13

+0

你應該包含你如何調用你的函數的代碼。 – BenH

+1

使用'progressBar $ i $ s'調用它,而不是'progressBar($ i,$ s)' –

回答

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顯示欄上的變量內容。你有一些語法錯誤。

  • 你的函數聲明應該是在頂部
  • $反應在0
  • $計數器開始+ = 1應是最後
2

下面是一個使用較少的修改版本的工作示例你的代碼。 有一些問題需要解決。

首先,讓我們看看「新」代碼。

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,但通過該函數無法使用$totalItems。這不是一個好的做法,因爲如果該變量在另一個腳本中沒有定義,它將會失敗。
  4. 您的函數參數中有逗號。這不是如何將參數傳遞給PowerShell的。
  5. 字符串連接用加號完成。但是,傳遞參數時,需要在括號之間包含它。 -status "Doing stuff on " + $color將不會工作,而-status ("Doing stuff on " + $color)會。更簡單的是,使用雙引號字符串時的自動擴展功能-status "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 
} 

最後,只是覺得我會提到它... Write-host,如果你不使用-nonewline開關參數自動附加一個新的生產線。也許你想要那裏多餘的空白線或者可能不是......只是覺得值得一提。