none
Powershell Script und Ordner löschen RRS feed

  • Frage

  • Guten Abend,

    in meinem PS Script lösche ich einen Ordner (mit Inhalt) mit remove-item

    {rd und rmdir gehen nicht}

    Befehlszeile:

    if (test-path "G:\Sich-Power-$NR") {remove-item "G:\Sich-Power-$NR" -FO -R}

    Das, funktioniert, aber dauert relativ lange (ca. 15 GB).

    Gibt es etwas Besseres, vor allem etwas Schnelleres?

    Gruß

    piano1311


    Walter Metzger

    Dienstag, 20. November 2018 18:19

Antworten

  • Was "Besseres" hängt sehr stark von den Anforderungen ab. Wenn so ein Script z.B. als geplante Aufgabe ausgeführt wird, ist die Laufzeit weniger wichtig bzw. egal.

    Wenn es um Dateisystem-Operationen geht, ist ein schnelles und einfaches Mittel immer robocopy. Wenn man einen leeren Ordner in einen vollen kopiert und dabei die Option /purge oder /mir benutzt, kann robocopy auch löschen und das auch sehr schnell.

    Für die Zukunft: Formatier doch bitte Code, den Du hier postest auch als Code. Danke.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 20. November 2018 18:55
  • So ... ich hatte heute einfach mal Bock drauf:

    Das folgende Script soll nur ein unverbindlicher Vorschlag sein, wie man sich dem Thema mittels Powershell nähern könnte. Ich glaube, dass der Code so deutlich flexibler und einfacher zu pflegen ist.

    Ich bin davon ausgegangen, dass auf dem ZielLaufwerk bereits die Basis-Ordner für die Backups (G:\Backup) und für die Log-Dateien (G:\BackupLog)  vorhanden sind. Ich habe mich bemüht, die meisten Konsolenausgaben zu unterdrücken, da das nur unnötig Zeit kostet. Es werden die 5 neuesten Backup-Sätze behalten.

    Das Script ist natürlich lange nicht perfect - z.B. fehlt jegliche Fehlerbehandlung. Ich habe mich auch bemüht, es vernünftig zu strukturieren. z.B. kannst Du die einzelnen Regionen in der ISE oder in VSCode einfach ein- und ausklappen und so einen einfacheren Überblick bekommen.

    #region BasisVariablen
        $ZielLaufwerk = 'G:'
        $ZielBasisPfad = 'Backup'
        $LogBasisPfad = 'BackupLog'
        [INT]$AnzahlVersionen = '5'
    #endregion BasisVariablen
    
    #region zu sichernde Ordner
        $QuellPfadListe = @(
            'C:\Users\walte\AppData\Roaming\LibreOffice\4',
            'C:\Users\walte\Desktop\Handbuecher',
            'C:\Users\walte\Documents',
            'C:\Users\walte\OneDrive\Bilder\ControlCenter4',
            'C:\Users\walte\Privat\Metzger',
            'C:\PMAIL',
            'C:\Program Files (x86)\SFirmV4',
            'C:\Program Files\SFirm SQL Server',
            'C:\ProgramData\Sfirm4_Neu2'
        )
    #endregion zu sichernde Ordner
    
    #region LaufzeitVariablen
        $ZielPfad = Join-Path -Path $ZielLaufwerk -ChildPath $ZielBasisPfad
        $LogPfad = Join-Path -Path $ZielLaufwerk -ChildPath $LogBasisPfad
        $Heute = (Get-Date).Date
        $NeuestesBackup = Get-ChildItem -Path $ZielPfad | Sort-Object -Property Name | Select-Object -Last 1
        $ZeitStempel = $Heute.ToString('yyyy-MM-dd')
    #endregion LaufzeitVariablen
    
    #region Test der Voraussetzungen
        if (-not (Test-Path -Path $ZielPfad)) {
            'Ziellaufwerk bzw. ZielPfad nicht gefunden ... Backup-Script Ende ...'
            Start-Sleep -Seconds 5
            Exit
        }
        if ($NeuestesBackup -and (Get-Date $NeuestesBackup.ToString()) -eq $ZeitStempel) {
            'Heute wurde bereits ein Backup durchgeführt ... Backup-Script Ende ...'
            Start-Sleep -Seconds 5
            Exit
        }
    #endregion Test der Voraussetzungen
    
    #region Backup
        Foreach ($QuellPfad in $QuellPfadListe) {
            $BackupZiel = Join-Path -Path (Join-Path -Path $ZielPfad -ChildPath $ZeitStempel) -ChildPath $QuellPfad.split(':')[1]
            $LogDatei = Join-Path -Path $LogPfad -ChildPath ($ZeitStempel + '.log')
            Start-Process -FilePath 'robocopy' -ArgumentList "$QuellPfad $BackupZiel /NP /E /XJ /R:2 /W:20 /FP /NC /NP /UNILOG+:$LogDatei" -Wait -NoNewWindow 
        }
    #endregion Backup
    
    #region Aufräumen
        $BackupListe = Get-ChildItem -Path $ZielPfad
        $LogDateiListe = Get-ChildItem -Path $LogPfad
        $TempOrdnerLeer = Join-Path -Path $ENV:TEMP -ChildPath (New-Guid).Guid
        $TempRobocopyLog = Join-Path -Path $ENV:TEMP -ChildPath (New-Guid).Guid
        if ($BackupListe.count -gt $AnzahlVersionen) {
            if (-not (Test-Path -Path $TempOrdnerLeer)) {
                New-Item -Path $TempOrdnerLeer -ItemType Directory | Out-Null
            }
            #$BackupListe | Sort-Object | Select-Object -First 1 | Remove-Item -Recurse -Force
            $AeltestesBackup = $BackupListe | Sort-Object | Select-Object -First 1 -ExpandProperty FullName
            Start-Process -FilePath 'robocopy' -ArgumentList "$TempOrdnerLeer $AeltestesBackup /MIR /NFL /NDL /NP /NJH /NJS /NS /NC" -Wait -NoNewWindow -RedirectStandardOutput $TempRobocopyLog
            Remove-Item -Path $AeltestesBackup -Force
            Remove-Item -Path $TempOrdnerLeer -Force
            Remove-Item -Path $TempRobocopyLog -Force
        }
        if ($LogDateiListe.count -gt $AnzahlVersionen) {
            $LogDateiListe | Sort-Object | Select-Object -First 1 | Remove-Item -Recurse -Force
        }
    #endregion Aufräumen

    Spiel ruhig ein bissl damit. Vielleicht kannst Du ja den ein oder anderen Code-Schnipsel verwenden.

    Viel Spaß


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 24. November 2018 01:45
  • Walter,

    auch auf die Gefahr hin, unhöflich oder anmassend zu erscheinen, aber das hier wird mein letzter Beitrag zu diesem Thread. Ohne die grundlegende Kenntnis von Powershell, macht es keinen Sinn hier weiterzumachen. Du stellst Anfängerfragen, die Du Dir mit einem genaueren Blick in den Code selbst beantworten kannst. Normaler Powershell-Code ist quasi selbst-erklärend bzw. selbst-dokumentierend. Natürlich basieren die Befehle auf Englisher Sprache - die Sprache der IT ist nun mal English. Wenn der Befehl Copy-Item heißt, braucht normalerweise niemand dazu zu schreiben, was der Befehl tut - er kopiert (copy) ein Element (Item). Die von mir gewählten Variablennamen sind auch ziemlich "sprechend" ...

    nach erneutem Aufruf meines Freecommanders

    Der FreeCommander aktualisiert die Ordneransicht nicht automatisch. Du kannst das in den Einstellungen anpassen oder einfach <strg><Strg>+<R><r>drücken (das Äquivalent zu <F5> <f5>im Explorer)</f5></r></strg>

    Es werden die 5 neuesten Backup-Sätze behalten. Wo wird das in Deinem Script gesteuert, ?

    [INT]$AnzahlVersionen = '5'

    legt die Anzahl der zu speichernden Versionen fest und wenn Du schaust, wo diese Variable benutzt wird, findest den Bereich

    #region Aufräumen

    darin wird die Anzahl der bereits existierenden Sicherungen geprüft und entsprechend reagiert. Ich habe das Löschen per robocopy umgesetzt. Wenn das keinen Vorteil bietet, kann man den Code an dieser Stelle mit purem Powershell auch deutlich einfacher halten. Man könnte diesen Block auch vor die eigentliche Backup-Routine packen und die Anzahl auf 4 verringern. Das spart dann einmal den Gesamtspeicherplatz des Backups ... hilft vielleicht wenn der Platz auf der Platte knapp wird.

    Ich werde mit Deinem Script "herumbasteln" um hinter die Geheimnisse zu kommen.

    Das ist ein bissl Dein Problem, glaube ich. Da gibt es überhaupt gar keine "Geheimnisse". Der Code liegt im Klartext vor und ist ziemlich selbsterklärend - wenigstens wenn man die Grundlagen von Powershell kennt. ;-)

    Laufwerk G: ist eine externe Intenso-Platte am USB Anschluss des Rechners.

    Damit ist der Flaschenhals für mich mehr oder weniger klar. Und ich halte die Schwankungen in der Geschwindigkeit, die Du erfährst, auch für ziemlich normal bei dieser Konfiguration.

    Das habe ich reinkopiert, wie mache ich das wieder "normal" ??????

    Das ist das Problem. Wenn Du "vorformatierten" Text in den Post-Editor kopierst, wird die Formatierung übernommen. Schreib direkt online im Editor oder kopier reinen Text hinein. Du kannst Dir auch die HTML-Ansicht anzeigen lassen. Dann siehst Du die entsprechenden HTML-Tags und kannst sie norfalls entfernen.

    Noch ein Hinweis BOfH (Dein Name steht nirgends)

    :-D :-D ... das ist so nicht ganz richtig. Mein Name steht eigentlich unter jeder meiner Nachrichten. !! ;-) ;-)

    insgesamt nur 37 Minuten und das ohne robocopy

    Das ist, was ich meinte. Bei Deiner Konfiguration mit USB-Platte und so weiter, ist der "Flaschenhals" eher das, als die Powershell. Wenn Du nur einen holprigen Feldweg zum Befahren hast, hilft Dir auch kein tiefergelegter Lamborghini.  ;-)

    .... blicke es aber noch nicht.

    ... ja ... Grundlagen von Powershell ... ;-)

    Also denn ... ich wünsche Dir noch viel Spaß und viel Erfolg mit Deinem Script und auch einen schönen Sonntag noch!

    ciao


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    Sonntag, 25. November 2018 15:13

Alle Antworten

  • Was "Besseres" hängt sehr stark von den Anforderungen ab. Wenn so ein Script z.B. als geplante Aufgabe ausgeführt wird, ist die Laufzeit weniger wichtig bzw. egal.

    Wenn es um Dateisystem-Operationen geht, ist ein schnelles und einfaches Mittel immer robocopy. Wenn man einen leeren Ordner in einen vollen kopiert und dabei die Option /purge oder /mir benutzt, kann robocopy auch löschen und das auch sehr schnell.

    Für die Zukunft: Formatier doch bitte Code, den Du hier postest auch als Code. Danke.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 20. November 2018 18:55
  • Danke für die Antwort,

    Für die Zukunft: Formatier doch bitte Code, den Du hier postest auch als Code. Danke.

    Was meinst Du mit Code formatieren?

    Gruß

    piano1311


    Walter Metzger

    Dienstag, 20. November 2018 20:12
  • Was meinst Du mit Code formatieren?

    Damit Code ohne störende Zeilenumbrüche und vernünftig formatiert und eingerückt und so weiter angezeigt werden kann, gibt es im Editor, in dem Du deinen Forum-Beitrag verfasst, eine Option, Code in einer speziellen Text-Box zu formatieren (das zweite Symbol von rechts). Wenn Du einfach mal hier im Forum gesucht hättest, bevor Du Deine Frage gestellt hast, hättest Du die Antwort wahrscheinlich auch schon gefunden. Du bist nicht der Erste, der so etwas fragt.  ;-)

    Vernünftig formatiert würde Dein Code ungefähr so aussehen:

    if (Test-Path -Path "G:\Sich-Power-$NR") {
        Remove-Item -Path "G:\Sich-Power-$NR" -Force -Recurse
    }


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''





    • Bearbeitet BOfH-666 Dienstag, 20. November 2018 23:13
    Dienstag, 20. November 2018 23:06
  • Mein Powerscript macht Sicherungen in 5 Generationen, ist die 5. erfolgt, wird die 1. gelöscht und mit G:\Sich-Power-1 (aktuelles Datum) neu angelegt. Das ganze steuert eine Schalterdatei, die über die Prozeduren G:\Sich-Power-Schalter-$EXund G:\Sich-Power-Schalter-$NRG:\Sich-Power-$NR löscht und später im Script neu anlegt.

    Alles funktioniert sehr gut, nur die Laufzeit von Remove-item beim 1. IF nervt und dafür hätte ich gerne etwas Anderes. Remove-item kommt dreimal vor.

    In dem Test-Script wird nur die Quelle1 bearbeitet.

    Habe ich es jetzt richtig „formatiert“ ?

    Gruß

    piano1311

    ####################################################
    # Sicherung auf Externe Platte mit robocopy
    # Kein Ersatz für Paragon & Recovery !!!
    #
    # Aufruf Windows-Taste, Alle Apps,
    # Windows Power ISE als Administrator aufrufen
    # 
    # 5 Generationen per Schalter steuern 
    #       
    ###########  Beginn robocopy Parameter ############################
    #  https://www.axel-hahn.de/batch/helferlein-und-tabellen/alle-windows-
    #  kommandos?id=robocopy
    #  daraus entnommen :: 
    #  /TEE :: Gibt Daten in das Konsolenfenster und die Protokolldatei aus
    #  /ETA :: Zeigt die ungefähre Empfangszeit der kopierten Dateien an
    #  /BYTES :: Gibt Größen in Bytes aus - War ohne  /BYTES auch schon enthalten
    #  /mir :: Spiegelt eine Verzeichnisstruktur (Entspricht "/E" mit "/PURGE")
    #  /FP :: Schließt den vollständigen Pfadnamen von Dateien in die Ausgabe ein.
    #  /unilog:Datei :: Gibt den Status der Protokolldatei als UNICODE aus 
    #  (überschreibt das vorhandene Protokoll)
    #  /unilog+:Datei :: Gibt den Status der Protokolldatei als UNICODE aus (wird an #  das vorhandene Protokoll angefügt)
    #  /np :: Kein Status - der Prozentsatz kopierter Elemente wird nicht angezeigt
    #  /V :: Erstellt eine ausführliche Ausgabe mit ausgelassenen
    #        Dateien.
    #  /MT[:n] :: Multithreadkopien mit n Threads erstellen
    #             Standardwert: "8").
    #             n muss zwischen 1 und 128 (einschließlich) liegen.
    #             Die Option ist nicht mit "/IPG" und "/EFSRAW" kompatibel.
    #             Die Ausgabe kann mit "/LOG" umgeleitet werden, um eine
    #             bessere Leistung zu erzielen.
    #
    #  Test mit /TEE /mir /MT:128 /V /np /unilog /unilog+ gut,auf andere übertragen
    #
    ###########  Schluss robocopy Parameter ############################
    #  
    # Stand 11.04.2018 um 17.45 - Neues 
    # Letzte Änderung - Quelle 8 und 9 eingefügt
    # Stand 20.06.2018 um 20.34 - E:\ in G:\ geändert 
    # Stand 21.08.2018 um 11.48 – Kleinigkeit
    # Stand 16.11.2018 um 23.23 – SFirmV3 – SFirmV4
    # Stand 19.11.2018 um 22.29 – rd -R -Fo und remove-item eingeführt
    # Stand 20.11.2018 um 16.39 – $Pa1 - $Pa6, auch $PA51
    # Stand 20.11.2018 um 17.26 – remove-item Zeile 104-106
    # Das ist nur das Test-Script
    #################################################### 
    #
    # Schritt 1: Abfragen Externe Platte
    #
    if (-not (test-path "G:\Sich-Powershell-Schalterdatei.ods")) {throw $End}
    #
    # Schritt 2: Zu sichernde Verzeichnisse
    # Die Definition wurde wegen robocopy neben Schritt 2 auch in Schritt 5 - ZielVZ # übernommen,das ergibt im Ziel eine bessere Aussage 
    # war bei copy-item über C:\Users\walte\Documents\Sich-PS-vfk.ps1 zweitrangig
    #
    # nur Test für $Quelle1
    #
    $Quelle1 = "C:\Users\walte\AppData\Roaming\LibreOffice\4"
    $Quelle2 = "C:\Users\walte\Desktop\Handbuecher"
    $Quelle3 = "C:\Users\walte\Documents"
    $Quelle4 = "C:\Users\walte\OneDrive\Bilder\ControlCenter4"
    $Quelle5 = "C:\Users\walte\Privat\Metzger"
    $Quelle6 = "C:\PMAIL"
    $Quelle7 = "C:\Program Files (x86)\SFirmV4"
    $Quelle8 = "C:\Program Files\SFirm SQL Server"
    $Quelle9 = "C:\ProgramData\Sfirm4_Neu2"
    #   
    #3 Schritt 3: Steuerung für 5 Generationen mit Variablen 
    #
    if (test-path "G:\Sich-Power-Schalter-1") {$EX = 1}
    if (test-path "G:\Sich-Power-Schalter-1") {$NR = 2} 
    if (test-path "G:\Sich-Power-Schalter-2") {$EX = 2}
    if (test-path "G:\Sich-Power-Schalter-2") {$NR = 3} 
    if (test-path "G:\Sich-Power-Schalter-3") {$EX = 3}
    if (test-path "G:\Sich-Power-Schalter-3") {$NR = 4}
    if (test-path "G:\Sich-Power-Schalter-4") {$EX = 4}
    if (test-path "G:\Sich-Power-Schalter-4") {$NR = 5}
    if (test-path "G:\Sich-Power-Schalter-5") {$EX = 5}
    if (test-path "G:\Sich-Power-Schalter-5") {$NR = 1}
    #
    # Schritt 4: Sicherungs-Verzeichnisse und den Schalter definieren,
    #            altes Sicherungs-Verzeichnis, altes Log-Verzeichnis
    #            und alten Schalter
    #      
    $ZielVZ = "G:\Sich-Power-$NR" 
    #
    $SchaVZ = "G:\Sich-Power-Schalter-$NR" # Netzwerkfreigabe
    #
    $LogVZ  = "G:\Sich-Power-Log-$NR"
    #
    $Pa1  = "/TEE"
    #
    $Pa2  = "/mir"
    #
    $Pa3  = "/MT:128"
    #
    $Pa4  = "/V"
    #
    $Pa5  = "/unilog:$LogVZ/text.log"
    #
    $Pa51  = "/unilog+:$LogVZ/text.log"
    #
    $Pa6  = "/np"
    #
    #$Zeitstempel = get-date -format "dd-MM-yyyy HH:mm:ss" # Zeitstempel erstellen 
    if (test-path "G:\Sich-Power-$NR") {Remove-item "G:\Sich-Power-$NR" -FO -R}
    if (test-path "G:\Sich-Power-Schalter-$EX") {Remove-item "G:\Sich-Power-Schalter-$EX" -FO -R}
    if (test-path "G:\Sich-Power-Log-$NR") {Remove-item "G:\Sich-Power-Log-$NR" -FO -R}
    #
    # Schritt 5: Sicherungs-Verzeichnis-ZielVZ-, Log-Datei-LogVZ- und neuen 
    # Schalter-SchaVZ- anlegen 
    # 
    mkdir $ZielVZ
    #
    mkdir $SchaVZ
    #
    mkdir $LogVZ
    #
    $Zeitstempel = get-date -format "dd-MM-yyyy HH:mm:ss" # Zeitstempel erstellen 
    "Sicherung Quelle 1-9 Beginn in $ZielVZ am/um $Zeitstempel"
    "Sicherung Quelle 1-9 Beginn in $ZielVZ am/um $Zeitstempel" > $LogVZ/text.log
    #
    # Schritt 5a: Kopieren mit Log-Datei und Anzeige in Notepad
    #
    # -a ist Abkuerzung fuer -Append (wie > und >> im Batch)
    #
    # chcp 1252
    # hat Umlautproblem in log-Datei nicht gelöst
    # aber unilog statt log
    #
    robocopy $Quelle1 $ZielVZ\"Users\walte\AppData\Roaming\LibreOffice\4\" $Pa1 $Pa2 $Pa3 $Pa4 $Pa5 $Pa6
    $Zeitstempel = get-date -format "dd-MM-yyyy HH:mm"
    "$Quelle1 beendet in $ZielVZ am/um $Zeitstempel" >> $LogVZ/text.log
    #
    $Zeitstempel = get-date -format "dd-MM-yyyy HH:mm:ss" # Zeitstempel erstellen 
    "Sicherung Quelle 1-9 beendet in $ZielVZ am/um $Zeitstempel"
    "Sicherung Quelle 1-9 beendet in $ZielVZ am/um $Zeitstempel" >> $LogVZ/text.log 
    #
    notepad $LogVZ/text.log
    #
    $End
    ########### END OF SCRIPT ########## 


    Walter Metzger

    Mittwoch, 21. November 2018 14:41
  • Hmmmmm.... Nicht böse sein, aber von guter Programmierlogik ist das weit entfernt...

    Schau Dir mal diesen Codeschnipsel an:

    $OldLogs = Get-ChildItem -Path $LogFilePath -Filter $CleanupFilter If ( $OldLogs.Count -gt $NumLogFiles ) { $OldLogs | Sort-Object -Property CreationTime -Descending | Select-Object -Last ( $OldLogs.Count - $NumLogFiles ) | ForEach-Object { Write-Verbose -Message ( 'Deleting old logfile {0} ...' -f $_ ) Remove-Item -Path $_.FullName -Force -ErrorAction Continue }

    }

    Du könntest statt der Durchnumerierung auch einfach einen Timestamp anhängen und mit Sort | Select die neuesten 4 oder 5 behalten.

    (BTW: Das verwende ich bei mir, um Logs von geplanten Tasks im Griff zu behalten - soll ja nicht die Platte voll laufen :-))

    • Bearbeitet Martin Binder Mittwoch, 21. November 2018 15:53 ....
    Mittwoch, 21. November 2018 15:51
  • Dnke für die Antwort,

    es funktioniert aber, daher kann die ...logik nicht so schlecht sein, vielleicht umständlich oder altmodisch.

    Mit Deinen Angaben fange ich leider überhaupt nichts an.

    Was ist Durchnumerierung?

    Was ist Timestamp?

    Wozu Sort?

    Wozu Select?

    Soll mit diesen Angaben die Verwaltung der 5 Generationen "vereinfacht werden"?

    Du könntest statt der Durchnumerierung auch einfach einen Timestamp anhängen und mit Sort | Select die neuesten 4 oder 5 behalten.

    Mein Problem und meine Anfrage war lediglich 

    die Laufzeit von Remove-item beim 1IF nervt und dafür hätte ich gerne etwas Anderes. 

    Remove-item kommt dreimal vor. 

    Haben Deine Äußerungen irgend etwas damit zu tun?

    Gruß

    piano1311


    Walter Metzger

    Mittwoch, 21. November 2018 17:16
  • es funktioniert aber, daher kann die ...logik nicht so schlecht sein, vielleicht umständlich oder altmodisch.

    Umständlich und aufwändig zu pflegen, genau. Dass etwas funktioniert, heißt ja nicht, dass es auch die beste Lösung ist. Man kann zum Beispiel einen Umzug mit einem Handwagen mache - es funktioniert, aber es ist unglaublich umständlich und aufwändig ;-)

    Was ist Durchnumerierung?

    z.B. Datei_01, Datei_02, Datei_03 .... usw.

    Was ist Timestamp?

    Ein Zeitstempel. Wenn Du den in Deine Dateinamen einbaust - z.B. im Format 2018-11-21 - dann sortierst Du, wenn Du die Dateien nach Name sortierst, ganz einfach auch nach Erstellungsdatum sortieren. Das ist sozusagen eine "best Practice"

    Wozu Sort?

    Damit Du beim Auswählen der Dateien mittels Select die richtigen Dateien erwischst.

    Wozu Select?

    Damit wählst Du eine Teilmenge der zurückgelieferten Dateiliste aus. Die Kriterien dafür kannst Du detailiert festlegen.

    Soll mit diesen Angaben die Verwaltung der 5 Generationen "vereinfacht werden"?

    Genau

    Mein Problem und meine Anfrage war lediglich die Laufzeit von Remove-item beim 1. IF nervt und dafür hätte ich gerne etwas Anderes.

    Wie oben schon geschrieben - mit robocopy kannst Du Dateioperationen auf relativ einfache Weise beschleunigen, die mit Standard-Mitteln der Powershell üblicherweise relativ träge sind.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Donnerstag, 22. November 2018 09:50
    Mittwoch, 21. November 2018 22:49
  • Hier noch ein kleines Beispiel für ein wenig besseren Stil:

    Anstatt 9 einzelner Variablen, die Du im Code alle einzeln "verwursten" müsstest, ....

    $Quelle2 = "C:\Users\walte\Desktop\Handbuecher"
    $Quelle3 = "C:\Users\walte\Documents"
    $Quelle4 = "C:\Users\walte\OneDrive\Bilder\ControlCenter4"
    $Quelle5 = "C:\Users\walte\Privat\Metzger"
    $Quelle6 = "C:\PMAIL"
    $Quelle7 = "C:\Program Files (x86)\SFirmV4"
    $Quelle8 = "C:\Program Files\SFirm SQL Server"
    $Quelle9 = "C:\ProgramData\Sfirm4_Neu2"

    ... erstellt man besser ein Array, über welches man mit einer Schleife "drüberläufst".

    $QuellPfadListe = @(
        "C:\Users\walte\AppData\Roaming\LibreOffice\4",
        "C:\Users\walte\Desktop\Handbuecher",
        "C:\Users\walte\Documents",
        "C:\Users\walte\OneDrive\Bilder\ControlCenter4",
        "C:\Users\walte\Privat\Metzger",
        "C:\PMAIL",
        "C:\Program Files (x86)\SFirmV4",
        "C:\Program Files\SFirm SQL Server",
        "C:\ProgramData\Sfirm4_Neu2"
    )
    Foreach($QuellPfad in $QuellPfadListe){
        $QuellPfad
    }

    Wenn Du jetzt einen Pfad hinzufügen willst, fügst Du diesen einfach dem Array hinzu und brauchst aber am restlichen Code absolut gar nix zu ändern.

    Vielleicht machst Du nochmal einen kleinen Schritt zurück und führst Dir nochmal ein Powershell-Buch oder einen Online-Kurs zu Gemüte. Ich glaube, es würde sich für Dich auszahlen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 21. November 2018 23:05
    Mittwoch, 21. November 2018 23:04
  • Hier noch ein kleines Beispiel für ein wenig besseren Stil

    Ich glaube, der TO weiß es ohnehin besser und hat schon beschlossen, daß ich ein Klugscheißer bin :-))

    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Donnerstag, 22. November 2018 08:16
  • Kopf hoch! Irgendwann wird es auch bei ihm durchsickern, dass wir ihm wirklich nur helfen wollen. ;-)

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 22. November 2018 08:34
  • Danke für Deine Bemühungen, mir zu helfen.

    Aber wegen einem einzigen PS-Script, das ich als ehemaliger Batch - Programmierer benötige,

    ist mir  ein Powershell-Buch oder ein Online-Kurs etwas sehr aufwändig.

    Ich habe mich inzwischen mit robocopy befasst und lediglich die beiden Parameter

    /MOVE



    kopierte Dateien und Verzeichnisse aus dem Quellordner löschen



    /PURGE



    Dateien und Verzeichnisse im Ziel löschen, die in der Quelle nicht existieren



    gefunden, die jedoch für meine Sicherung mit 5 Generationen nicht in Fragen kommen.

    Für meinen Zweck muss ich einen bestehenden Ordner ganz löschen und mit neuem Datum und

    neuem Inhalt aufbauen. Für die Löschfunktion habe ich bisher nur Remove-item gefunden, das auch funktioniert und um es wiederholt zu sagen, nur relativ lang braucht für 10-20 GB.

    Wenn ich Dich nerve, dann sag es mir bitte oder schmeiß mich raus.

    Gruß

    piano1311


    Walter Metzger

    Donnerstag, 22. November 2018 09:39
  • Du möchtest das Löschen eines Ordners beschleunigen, richtig? Dann kannst Du mit robocopy den Inhalt des Ordners löschen und den Ordner anschließend umbenennen oder mit Powershell-Mitteln den dann auch noch löschen und neu anlegen. Das geht bestimmt schneller als mit Remove-Item.  :-P

    Wenn Du noch ne Weile in Windows-Umgebungen administrativ unterwegs sein möchtest, lohnt sich der Aufwand auf jeden Fall.  ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 22. November 2018 09:48
  • Danke für die Antwort,

    aber bei robocopy finde ich keinen Parameter, der Dateien löscht.

    Wenn Du einen kennst, sage ihn mir bitte.

    Dagegen funktioniert immer noch,

    if (test-path "G:\Sich-Power-$NR") {Remove-Item -Recurse -Force "G:\Sich-Power-$NR"}

    auch wenn es etwas dauert, bis der Ordner G:\Sich-Power-$NR gelöscht ist.

    Gruß

    piano1311


    Walter Metzger

    Freitag, 23. November 2018 09:25
  • Das hatte ich in meiner ersten Antwort erklärt!!!!!!!

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 23. November 2018 10:10
  • Um es anders zu erklären: Löschen kann man auch, indem man in das Ziel etwas leeres hineinsynchronisiert (aka "spiegelt", englisch "mirroring" oder kurz /mir). Puh :)

    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Freitag, 23. November 2018 10:45
  • Danke, das ist wahr, 

    aber 

    if (test-path "G:\Sich-Power-$NR") {robocopy G:\Robosich-Leer /mir "G:\Sich-Power-$NR"}

    dauert ja 3-4 mal so lang wie 

    if (test-path "G:\Sich-Power-Schalter-$EX") {Remove-Item -Recurse -Force "G:\Sich-Power-$Nr"}

    alleine, ausserdem wäre ja auch beides, Dateien und Ordner, also

    if (test-path "G:\Sich-Power-$NR") {robocopy G:\Robosich-Leer /mir "G:\Sich-Power-$NR"}
    if (test-path "G:\Sich-Power-$NR") {Remove-Item -Recurse -Force "G:\Sich-Power-$Nr"}

    erforderlich. (Warum die Schrift hier manchmal kleiner wird, ist mir ein Rätsel !!!

    Kannst Du mir bitte Deinen Vorschlag vom 21.1.2018

    ... erstellt man besser ein Array, über welches man mit einer Schleife "drüberläufst".

    erklären, wie man das macht in meinem Script. Das interessiert mich sehr.

    Gruß

    piano1311


    Walter Metzger



    • Bearbeitet piano1311 Freitag, 23. November 2018 11:25
    Freitag, 23. November 2018 11:21
  • .... dauert ja 3-4 mal so lang wie ...

    OK, bisher hatte ich es nur vermutet - Du hattest das auch nicht näher spezifiziert - aber ich gehe mal davon aus, das G: kein lokales Laufwerk ist, sondern ein Netzlauferk, richtig? Damit ist Dein Flaschenhals auch nicht die Dateioperation selbst, sondern das Ausführen derselben über das Netzwerk. Am einfachsten beschleunigst Du das, indem Du die Dateioperation auf den Computer auslagerst, auf dem die Dateien liegen. Da kann man vom Computer, auf dem das Script läuft nicht wirklich viel machen. Sollte der Zielcomputer eine Windowsmaschine sein, kannst Du Powershell-Remoting benutzen, um das entsprechend umzusetzen. Ich hab mir mal den Spaß gemacht und die Zeit gemessen, die mein nicht mehr ganz aktueller PC braucht um ca. 25.000 Dateien mit einer Gesamtgröße von 17GB zu löschen. Es waren 10 Sekunden. Und es ist nicht mal eine SSD.

    Kannst Du mir bitte Deinen Vorschlag vom 21.1.2018 ....

    Dieses Forum hier ist für IT-Profis, die Fragen zu selbstgeschreibenem Code haben. Von Dir wird also erwartet, dass Du auch ein bissl mitarbeitest. Ich hatte Beispiel-Code gepostet. Hast Du Dir den mal angesehen? Hast Du den mal ausprobiert? Du darfst auch gern Deine Lieblingssuchmaschine benutzen und Dir weitere Info bsorgen. Es gibt buchstäblich tausende Beipiele im Netz.

    Vielleicht wäre das mit dem kostenlosen Video-Kurs von MS doch keine so schlechte Idee - hier nochmal der Link: MVA - Getting Started with Powershell. Die Video haben eine Laufzeit von zusammen vielleicht 8 bis 10 Stunden und danach hast Du schon ein gutes Basis-Wissen über Powershell. ;-) Fang doch erstmal an ... abbrechen kannst Du ja immer noch.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 23. November 2018 17:18
  • Danke für die Antwort,

    ich beuge mein Haupt demütig, robocopy c:/leer auf  c:/inhalt geht wie das Katzenmachen, Du hast Recht.

    Ich wollte mit Powershell gezielt sichern, um mit dem normalen Kopierbefehl Dateien zurückzuholen.

    Wieder wird die Schrift klein, warum !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Wie mache ich die wieder normal??????????????????????

    Ich war nach dieser letzten Nachricht von Dir eigentlich innerlich bereit, mich in Powershell "fortzubilden", aber  der Link: MVA - Getting Started with Powershell ist in englisch. Müsste mir Deutsche Youtubes suchen. 

    Du schreibst:

    Am einfachsten beschleunigst Du das, indem Du die Dateioperation auf den Computer auslagerst, auf dem die Dateien liegen.

    Unter "auslagern" habe ich bisher immer eine externe Platte verstanden.

    Also sag mir definitiv, dass Powershell von C: auf G: (extern) keinen Sinn macht, oder?

    Gruß

    piano1311


    Walter Metzger

    Freitag, 23. November 2018 19:16
  • Walter, Walter, Walter,

    kann es sein, dass Du Dir das Leben selber gern ein bissl schwerer machst als unbedingt nötig? ;-) :-D

    Ich wollte mit Powershell gezielt sichern, um mit dem normalen Kopierbefehl Dateien zurückzuholen.

    Den Satz verstehe ich nicht so richtig.

    Ich war nach dieser letzten Nachricht von Dir eigentlich innerlich bereit, mich in Powershell "fortzubilden", aber ... ist in englisch. Müsste mir Deutsche Youtubes suchen.

    Es gibt in der MVA auch deutsche Inhalte. Aber ich gehe im Allgemeinen davon aus, dass man, wenn man mit IT unterwegs ist, sowieso einigermaßen English kann und es geht ja auch nicht um höhere Mathematik, Philosophie oder Politik - das Vokabular ist also eher technisch und nicht zu abgehoben. Und im von mir verlinkten Kurs lernst Du die Grundlagen der Powershell vom Erfinder der Powershell - Jeffrey Snover.  ;-) ;-) :-O

    Also sag mir definitiv, dass Powershell von C: auf G: (extern) keinen Sinn macht, oder?

    Ist Laufwerk G: ein lokales Laufwerk oder ein Netzlaufwerk? Wenn es ein Netzlaufwerk ist - also ein Laufwerk auf einem anderen Computer oder auf einem NAS-Laufwerk, dann ist meistens das Netzwerk der limitierende Faktor. Sollte Laufwerk G: ein USB-Laufwerk sein, kann der Flaschenhals auch da liegen. Ich gehe bei Fragen hier im Forum natürlich eher von einer professionellen Enterprise-Infrastruktur aus. ;-)

    Edit: Wenn das eher ein privates Projekt ist, könntest Du Dir, wenn Du selber frickeln möchtest, mal rsyncbackup von der c't redaktion ansehen. Oder wenn es etwas komfortabler und mit GUI sein soll - Hardlinkbackup (welches von rsyncbackup inspiriert wurde). Mit der kostenpflichtigen Pro-Version kannst Du das Ganze auch automatisieren bzw. scripten.

    Vorausgesetzt, das Ziellaufwerk ist mit NTFS formatiert, könntest Du mit beiden Tools deutlich mehr Backup-Versionen speichern und trotzdem eine Menge Speicherplatz sparen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH-666 Freitag, 23. November 2018 23:31
    Freitag, 23. November 2018 21:19
  • So ... ich hatte heute einfach mal Bock drauf:

    Das folgende Script soll nur ein unverbindlicher Vorschlag sein, wie man sich dem Thema mittels Powershell nähern könnte. Ich glaube, dass der Code so deutlich flexibler und einfacher zu pflegen ist.

    Ich bin davon ausgegangen, dass auf dem ZielLaufwerk bereits die Basis-Ordner für die Backups (G:\Backup) und für die Log-Dateien (G:\BackupLog)  vorhanden sind. Ich habe mich bemüht, die meisten Konsolenausgaben zu unterdrücken, da das nur unnötig Zeit kostet. Es werden die 5 neuesten Backup-Sätze behalten.

    Das Script ist natürlich lange nicht perfect - z.B. fehlt jegliche Fehlerbehandlung. Ich habe mich auch bemüht, es vernünftig zu strukturieren. z.B. kannst Du die einzelnen Regionen in der ISE oder in VSCode einfach ein- und ausklappen und so einen einfacheren Überblick bekommen.

    #region BasisVariablen
        $ZielLaufwerk = 'G:'
        $ZielBasisPfad = 'Backup'
        $LogBasisPfad = 'BackupLog'
        [INT]$AnzahlVersionen = '5'
    #endregion BasisVariablen
    
    #region zu sichernde Ordner
        $QuellPfadListe = @(
            'C:\Users\walte\AppData\Roaming\LibreOffice\4',
            'C:\Users\walte\Desktop\Handbuecher',
            'C:\Users\walte\Documents',
            'C:\Users\walte\OneDrive\Bilder\ControlCenter4',
            'C:\Users\walte\Privat\Metzger',
            'C:\PMAIL',
            'C:\Program Files (x86)\SFirmV4',
            'C:\Program Files\SFirm SQL Server',
            'C:\ProgramData\Sfirm4_Neu2'
        )
    #endregion zu sichernde Ordner
    
    #region LaufzeitVariablen
        $ZielPfad = Join-Path -Path $ZielLaufwerk -ChildPath $ZielBasisPfad
        $LogPfad = Join-Path -Path $ZielLaufwerk -ChildPath $LogBasisPfad
        $Heute = (Get-Date).Date
        $NeuestesBackup = Get-ChildItem -Path $ZielPfad | Sort-Object -Property Name | Select-Object -Last 1
        $ZeitStempel = $Heute.ToString('yyyy-MM-dd')
    #endregion LaufzeitVariablen
    
    #region Test der Voraussetzungen
        if (-not (Test-Path -Path $ZielPfad)) {
            'Ziellaufwerk bzw. ZielPfad nicht gefunden ... Backup-Script Ende ...'
            Start-Sleep -Seconds 5
            Exit
        }
        if ($NeuestesBackup -and (Get-Date $NeuestesBackup.ToString()) -eq $ZeitStempel) {
            'Heute wurde bereits ein Backup durchgeführt ... Backup-Script Ende ...'
            Start-Sleep -Seconds 5
            Exit
        }
    #endregion Test der Voraussetzungen
    
    #region Backup
        Foreach ($QuellPfad in $QuellPfadListe) {
            $BackupZiel = Join-Path -Path (Join-Path -Path $ZielPfad -ChildPath $ZeitStempel) -ChildPath $QuellPfad.split(':')[1]
            $LogDatei = Join-Path -Path $LogPfad -ChildPath ($ZeitStempel + '.log')
            Start-Process -FilePath 'robocopy' -ArgumentList "$QuellPfad $BackupZiel /NP /E /XJ /R:2 /W:20 /FP /NC /NP /UNILOG+:$LogDatei" -Wait -NoNewWindow 
        }
    #endregion Backup
    
    #region Aufräumen
        $BackupListe = Get-ChildItem -Path $ZielPfad
        $LogDateiListe = Get-ChildItem -Path $LogPfad
        $TempOrdnerLeer = Join-Path -Path $ENV:TEMP -ChildPath (New-Guid).Guid
        $TempRobocopyLog = Join-Path -Path $ENV:TEMP -ChildPath (New-Guid).Guid
        if ($BackupListe.count -gt $AnzahlVersionen) {
            if (-not (Test-Path -Path $TempOrdnerLeer)) {
                New-Item -Path $TempOrdnerLeer -ItemType Directory | Out-Null
            }
            #$BackupListe | Sort-Object | Select-Object -First 1 | Remove-Item -Recurse -Force
            $AeltestesBackup = $BackupListe | Sort-Object | Select-Object -First 1 -ExpandProperty FullName
            Start-Process -FilePath 'robocopy' -ArgumentList "$TempOrdnerLeer $AeltestesBackup /MIR /NFL /NDL /NP /NJH /NJS /NS /NC" -Wait -NoNewWindow -RedirectStandardOutput $TempRobocopyLog
            Remove-Item -Path $AeltestesBackup -Force
            Remove-Item -Path $TempOrdnerLeer -Force
            Remove-Item -Path $TempRobocopyLog -Force
        }
        if ($LogDateiListe.count -gt $AnzahlVersionen) {
            $LogDateiListe | Sort-Object | Select-Object -First 1 | Remove-Item -Recurse -Force
        }
    #endregion Aufräumen

    Spiel ruhig ein bissl damit. Vielleicht kannst Du ja den ein oder anderen Code-Schnipsel verwenden.

    Viel Spaß


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 24. November 2018 01:45
  • Danke für die Antwort,

    Du bist ja sehr gut für mich tätig.

    Nun:

    Ich habe folgendes getan, Ich 

    a) mein eigenes Script "Sich-PS-Walter-robot-lang.ps1" laufen lassen,

        ich bekam im logfile

        Gestartet: Samstag, 24. November 2018 21:12:38

        Geschwindigkeit:             8870630 Bytes/Sek.
        Geschwindigkeit:             507.581 Megabytes/Min.
        Beendet: Samstag, 24. November 2018 21:33:04
        Sicherung Quelle 1-9 beendet in G:\Sich-Power-1 am/um 24-11-2018 21:33

        Das Script wurde um 20:44 gestartet, bis 21:12 lief das Überschreiben mir Rob-Leer 

    if (test-path $ZielVZ) {robocopy C:\Users\walte\Documents\Rob-Leer /mir $ZielVZ}
    if (test-path $ZielVZ) {Remove-Item -Recurse -Force $ZielVZ}
    if (test-path $SchaVZE) {Remove-Item -Recurse -Force $SchaVZE}
    if (test-path $LogVZ) {Remove-Item -Recurse -Force $LogVZ}

    b) Dein Script Backup-"BOfH.ps1" laufen lassen,

        ich bekam im logfile

        Gestartet: Samstag, 24. November 2018 21:53:25

        Geschwindigkeit:             3543995 Bytes/Sek.
        Geschwindigkeit:             202.789 Megabytes/Min.
        Beendet: Samstag, 24. November 2018 22:48:54

    c) Dein Script lief 55 Minuten, mein Scipt lief 49 Minuten

    d) dann wollte ich "BOfH.ps1" nochmals laufen lassen, wegen der 5 Generationen, Meldung

    'Heute wurde bereits ein Backup durchgeführt ... Backup-Script Ende ...'

    e) Heute Morgen habe ich für den Test der Generationen Dein Script verkürzt in Backup-"BOfH-klein.ps1"

    #region zu sichernde Ordner
        $QuellPfadListe = @(
            'C:\Users\walte\AppData\Roaming\LibreOffice\4',
            'C:\Users\walte\Desktop\Handbuecher'
            #'C:\Users\walte\Documents',
            #'C:\Users\walte\OneDrive\Bilder\ControlCenter4',
            #'C:\Users\walte\Privat\Metzger',
            #'C:\PMAIL',
            #'C:\Program Files (x86)\SFirmV4',
            #'C:\Program Files\SFirm SQL Server',
            #'C:\ProgramData\Sfirm4_Neu2'
        )
    #endregion zu sichernde Ordner

    und das Ergebnis mit dem Logfile von 24-11-2018 in 20-11-2018 umbenannt

    e) "BOfH-klein.ps1" gestartet, 25-11-2018 in 21-11-2018 umbenannt

         "BOfH-klein.ps1" gestartet, 25-11-2018 in 22-11-2018 umbenannt

          "BOfH-klein.ps1" gestartet, 25-11-2018 in 23-11-2018 umbenannt

          "BOfH-klein.ps1" gestartet, 25-11-2018 in 24-11-2018 umbenannt

    Jetzt hatte ich 5 Generationen

    Ich habe erneut

           "BOfH-klein.ps1" gestartet, habe 25-11-2018 erhalten, 

    Jetzt habe ich 6 Generationen, die 1. vom 20-11-2018 ist immer noch da. 

    Kommando zurück, nach erneutem Aufruf meines Freecommanders ist die 1. Sicherung weg,

    ich habe nur noch

    2018-11-21
    2018-11-22
    2018-11-23
    2018-11-24
    2018-11-25

    Du schreibst:

    Es werden die 5 neuesten Backup-Sätze behalten. 

    Wo wird das in Deinem Script gesteuert, ? 

    Kannst Du mir das bitte sage, auch wo die blöde kleine Schrift herkommt und ob und wie man die

    in dieser Darstellung wieder weg bekommt.

    Fazit und Vergleich Dein und mein Script:

    In meinem Script werden im linken Powershell-Fenster die Kopiervorgänge angezeigt,

    In deinem Script steht dauernd z.B. 25-11-2018 bis das Script fertig ist.

    Es ist nicht unpraktisch, wenn mein Script endlose Ausführungen verträgt,

    Sich-Power-1
    Sich-Power-2
    Sich-Power-3
    Sich-Power-4
    Sich-Power-5

    und dann wieder Sich-Power-1 wegen meiner Schalterdatei usw.

    Ich werde mit Deinem Script "herumbasteln" um hinter die Geheimnisse zu kommen.

    Laufwerk G: ist eine externe Intenso-Platte am USB Anschluss des Rechners.

    Darauf mache ich auch meine Sicherung mit meiner Backup Software

    Paragon Festplatten Manager™,Version 10.1.25.1137 ( 21.04.17 ) Professional

    Das habe ich reinkopiert, wie mache ich das wieder "normal" ??????

    Gruß

    piano1311


    Walter Metzger


    • Bearbeitet piano1311 Sonntag, 25. November 2018 08:49
    Sonntag, 25. November 2018 08:45
  • Noch ein Hinweis BOfH (Dein Name steht nirgends)

    ich machte mit "Sich-PS-Walter-robot-lang.ps1" einen weiteren Lauf ohne 

    robocopy C:\Users\walte\Documents\Rob-Leer

    #if (test-path $ZielVZ) {robocopy C:\Users\walte\Documents\Rob-Leer /mir $ZielVZ}
    if (test-path $ZielVZ) {Remove-Item -Recurse -Force $ZielVZ}
    if (test-path $SchaVZE) {Remove-Item -Recurse -Force $SchaVZE}
    if (test-path $LogVZ) {Remove-Item -Recurse -Force $LogVZ}

    Beginn 10:10

    Beginn Kopieren 10:27

    Ende 10:47

    insgesamt nur 37 Minuten und das ohne robocopy C:\Users\walte\Documents\Rob-Leer.

    Was sagst Du jetzt, Dein "BOfH.ps1" teste ich gerade wegen

    #region zu sichernde Ordner
        $QuellPfadListe = @(
            'C:\Users\walte\AppData\Roaming\LibreOffice\4',
            'C:\Users\walte\Desktop\Handbuecher',
            'C:\Users\walte\Documents',
            'C:\Users\walte\OneDrive\Bilder\ControlCenter4',
            'C:\Users\walte\Privat\Metzger',
            'C:\PMAIL',
            'C:\Program Files (x86)\SFirmV4',
            'C:\Program Files\SFirm SQL Server',
            'C:\ProgramData\Sfirm4_Neu2'
        )
    #endregion zu sichernde Ordner

    blicke es aber noch nicht.

    Gruß

    piano1311

     

    Walter Metzger

    Sonntag, 25. November 2018 10:34
  • Walter,

    auch auf die Gefahr hin, unhöflich oder anmassend zu erscheinen, aber das hier wird mein letzter Beitrag zu diesem Thread. Ohne die grundlegende Kenntnis von Powershell, macht es keinen Sinn hier weiterzumachen. Du stellst Anfängerfragen, die Du Dir mit einem genaueren Blick in den Code selbst beantworten kannst. Normaler Powershell-Code ist quasi selbst-erklärend bzw. selbst-dokumentierend. Natürlich basieren die Befehle auf Englisher Sprache - die Sprache der IT ist nun mal English. Wenn der Befehl Copy-Item heißt, braucht normalerweise niemand dazu zu schreiben, was der Befehl tut - er kopiert (copy) ein Element (Item). Die von mir gewählten Variablennamen sind auch ziemlich "sprechend" ...

    nach erneutem Aufruf meines Freecommanders

    Der FreeCommander aktualisiert die Ordneransicht nicht automatisch. Du kannst das in den Einstellungen anpassen oder einfach <strg><Strg>+<R><r>drücken (das Äquivalent zu <F5> <f5>im Explorer)</f5></r></strg>

    Es werden die 5 neuesten Backup-Sätze behalten. Wo wird das in Deinem Script gesteuert, ?

    [INT]$AnzahlVersionen = '5'

    legt die Anzahl der zu speichernden Versionen fest und wenn Du schaust, wo diese Variable benutzt wird, findest den Bereich

    #region Aufräumen

    darin wird die Anzahl der bereits existierenden Sicherungen geprüft und entsprechend reagiert. Ich habe das Löschen per robocopy umgesetzt. Wenn das keinen Vorteil bietet, kann man den Code an dieser Stelle mit purem Powershell auch deutlich einfacher halten. Man könnte diesen Block auch vor die eigentliche Backup-Routine packen und die Anzahl auf 4 verringern. Das spart dann einmal den Gesamtspeicherplatz des Backups ... hilft vielleicht wenn der Platz auf der Platte knapp wird.

    Ich werde mit Deinem Script "herumbasteln" um hinter die Geheimnisse zu kommen.

    Das ist ein bissl Dein Problem, glaube ich. Da gibt es überhaupt gar keine "Geheimnisse". Der Code liegt im Klartext vor und ist ziemlich selbsterklärend - wenigstens wenn man die Grundlagen von Powershell kennt. ;-)

    Laufwerk G: ist eine externe Intenso-Platte am USB Anschluss des Rechners.

    Damit ist der Flaschenhals für mich mehr oder weniger klar. Und ich halte die Schwankungen in der Geschwindigkeit, die Du erfährst, auch für ziemlich normal bei dieser Konfiguration.

    Das habe ich reinkopiert, wie mache ich das wieder "normal" ??????

    Das ist das Problem. Wenn Du "vorformatierten" Text in den Post-Editor kopierst, wird die Formatierung übernommen. Schreib direkt online im Editor oder kopier reinen Text hinein. Du kannst Dir auch die HTML-Ansicht anzeigen lassen. Dann siehst Du die entsprechenden HTML-Tags und kannst sie norfalls entfernen.

    Noch ein Hinweis BOfH (Dein Name steht nirgends)

    :-D :-D ... das ist so nicht ganz richtig. Mein Name steht eigentlich unter jeder meiner Nachrichten. !! ;-) ;-)

    insgesamt nur 37 Minuten und das ohne robocopy

    Das ist, was ich meinte. Bei Deiner Konfiguration mit USB-Platte und so weiter, ist der "Flaschenhals" eher das, als die Powershell. Wenn Du nur einen holprigen Feldweg zum Befahren hast, hilft Dir auch kein tiefergelegter Lamborghini.  ;-)

    .... blicke es aber noch nicht.

    ... ja ... Grundlagen von Powershell ... ;-)

    Also denn ... ich wünsche Dir noch viel Spaß und viel Erfolg mit Deinem Script und auch einen schönen Sonntag noch!

    ciao


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    Sonntag, 25. November 2018 15:13