none
Write-Progress ohne Powershell-ISE RRS feed

  • 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

    Freitag, 27. April 2012 04:55

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".


    Freitag, 27. April 2012 12:37
    Moderator

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)

    Siehe: http://blogs.technet.com/b/heyscriptingguy/archive/2011/01/29/add-a-progress-bar-to-your-powershell-script.aspx


    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' '


    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".


    Freitag, 27. April 2012 12:37
    Moderator
  • 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' '


    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, 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".

    Freitag, 27. April 2012 14:53
    Moderator
  • Hey,

    vielen dank Jungs.
    Damit kann ich aufjedenfall was anfangen :-)

    Gruß

    mk.maddin

    Samstag, 28. April 2012 12:48