Benutzer mit den meisten Antworten
Write-Progress ohne Powershell-ISE

Frage
-
Hallo liebe Forenmitglieder,
Ich habe ein powershell script bei dem ich mit write-Progress eine prozessleiste ausgebe.
Der Code sieht so aus:Write-Progress -Activity $Activity -status "Copy $Software_Name" -percentComplete ($Progress_Bar / $Default_Software_Count*100)
Führe ich ihn über die Powershell_ISE aus funktioniert Write-Progress ohne probleme.
Führe ich den code aber mithilfe von Powershell.exe -file meincode.ps1 aus wird die Prozessleiste nicht mit angezeigt.
Auch nicht wenn ich powershell.exe -STA -file meincode.ps1 ausführe.Welcher parameter muss mit angegeben werden damit die Prozessleiste angezeigt wird?
Vielen dank für eure Hilfe
mk.maddin
Antworten
-
Write-Progress funktioniert immer, auch im Script. Wie es dir allerdings angezeigt wird, hängt vom Host ab. ISE und andere Editoren rendern die Fortschittsanzeige in Winforms oder WPF, die Console zeigt sie als ASCII-Zeichen an.
Hier ist ein Beispiel:$allFiles = Get-ChildItem 'C:\Program Files' -recurse foreach ($file in $allFiles) { $i++ $intSize = $intSize + $file.Length Write-Progress -activity "Adding File Sizes" -status "Percent added: " -PercentComplete (($i / $allFiles.length) * 100) } Write-Host "Total size of all files: $intSize bytes."
Das sieht dann so aus:
Wichtig ist aber zu beachten, das alle Fortschrittsanzeigen deinen Code deutlich verlangsamen. Write-Progress in der Console ist da besonders heftig.
Wenn du eine "richtige", d.h. grafische Fortschrittsanzeige möchtest, musst du Winforms benutzen, was etwas komplizierter-, aber auch schneller als Write-Progress ist.
Das gleiche Script mit einer Winforms ProgressBar:
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # Erstelle Fenster $Form1 = New-Object System.Windows.Forms.Form $Form1.ClientSize = "272,78" $Form1.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedToolWindow # Dieser Code wird beim erstmaligen anzeigen des Fensters ausgeführt $Form1.add_Shown({ # Maximum Wert der Fortschrittsanzeige = Anzahl der Files $ProgressBar1.Maximum = $allFiles.length foreach ($file in $allFiles) { $ProgressBar1.PerformStep() # Fortschrittsanzeige um einen Schritt weiter $intSize = $intSize + $file.Length } $Form1.Close() Write-Host "Total size of all files: $intSize bytes." }) # Erstelle Fortschrittsanzeige $ProgressBar1 = New-Object System.Windows.Forms.ProgressBar $ProgressBar1.Location = "12,21" $ProgressBar1.Size = "245,33" $ProgressBar1.Step = 1 # Schrittweite für" .performstep()" $Form1.Controls.Add($ProgressBar1) $allFiles = Get-ChildItem 'C:\Program Files' -recurse
# Zeige Fenster $Form1.showdialog()
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Bearbeitet Denniver ReiningMVP, Moderator Freitag, 27. April 2012 14:46
- Als Antwort markiert mk.maddin Samstag, 28. April 2012 12:47
Alle Antworten
-
Das ist Absicht so!
Wenn du die ISE offen hast wird dir der Fortschritt in der Ise angezeigt!
Wenn du di PowerShell Konsole offen hast wird dir der Fortschritt in dem Konsolen Fenster angezeigt.
Ein Script hat kein Fenster! Wo soll denn der Fortschritt Angezeigt werden?? In einer Datei (loggen) macht keinen Sinn (meistens)
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Freitag, 27. April 2012 11:10
-
Write-Progress funktioniert immer, auch im Script. Wie es dir allerdings angezeigt wird, hängt vom Host ab. ISE und andere Editoren rendern die Fortschittsanzeige in Winforms oder WPF, die Console zeigt sie als ASCII-Zeichen an.
Hier ist ein Beispiel:$allFiles = Get-ChildItem 'C:\Program Files' -recurse foreach ($file in $allFiles) { $i++ $intSize = $intSize + $file.Length Write-Progress -activity "Adding File Sizes" -status "Percent added: " -PercentComplete (($i / $allFiles.length) * 100) } Write-Host "Total size of all files: $intSize bytes."
Das sieht dann so aus:
Wichtig ist aber zu beachten, das alle Fortschrittsanzeigen deinen Code deutlich verlangsamen. Write-Progress in der Console ist da besonders heftig.
Wenn du eine "richtige", d.h. grafische Fortschrittsanzeige möchtest, musst du Winforms benutzen, was etwas komplizierter-, aber auch schneller als Write-Progress ist.
Das gleiche Script mit einer Winforms ProgressBar:
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # Erstelle Fenster $Form1 = New-Object System.Windows.Forms.Form $Form1.ClientSize = "272,78" $Form1.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedToolWindow # Dieser Code wird beim erstmaligen anzeigen des Fensters ausgeführt $Form1.add_Shown({ # Maximum Wert der Fortschrittsanzeige = Anzahl der Files $ProgressBar1.Maximum = $allFiles.length foreach ($file in $allFiles) { $ProgressBar1.PerformStep() # Fortschrittsanzeige um einen Schritt weiter $intSize = $intSize + $file.Length } $Form1.Close() Write-Host "Total size of all files: $intSize bytes." }) # Erstelle Fortschrittsanzeige $ProgressBar1 = New-Object System.Windows.Forms.ProgressBar $ProgressBar1.Location = "12,21" $ProgressBar1.Size = "245,33" $ProgressBar1.Step = 1 # Schrittweite für" .performstep()" $Form1.Controls.Add($ProgressBar1) $allFiles = Get-ChildItem 'C:\Program Files' -recurse
# Zeige Fenster $Form1.showdialog()
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Bearbeitet Denniver ReiningMVP, Moderator Freitag, 27. April 2012 14:46
- Als Antwort markiert mk.maddin Samstag, 28. April 2012 12:47
-
Sicher funktioniert Write-Progress auch im Skript! Aber nur wenn ein Konsolenfenster für diese Skript zu verfügung steht!
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Freitag, 27. April 2012 12:47
-
> nur wenn ein Konsolenfenster für diese Skript zu verfügung steht!
Was Standardmäßig der Fall ist, es sei denn du unterdrückst es explizit. :)
Grüße, DenniverBlog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".