Ich schreibe gerade ein Skript in Powershell, das das Kopieren eines Ordners in einem SVN-Repository zu einem anderen ermöglicht, während der Verlauf beibehalten wird. Ein Beispiel für einen solchen Befehl lautet:Powershell-Piping verursacht explosiven Speicherverbrauch
svnadmin.exe dump $FromRepoPath `
| svndumpfilter.exe include --drop-empty-revs --renumber-revs --preserve-revprops $Folder `
| svnadmin.exe load --ignore-uuid $ToRepoPath
Dies verursacht eine sehr hohe Speicherauslastung in Powershell. Es scheint, dass Powershell zuerst svnadmin.exe ausführt und das stdout von SVN admin puffert, dann svndumpfilter ausführt und diese Ausgabe puffert und schließlich svnadmin.exe ausführt.
Ich kann es umgehen, indem eine separate Batch-Datei zu erstellen:
@echo off
svnadmin.exe dump %1 | svndumpfilter.exe include --drop-empty-revs --renumber-revs --preserve-revprops %2 | svnadmin.exe load --ignore-uuid %3
Und dann ist es von Powershell-Aufruf:
cmd.exe /c "SvnHelper.cmd $FromRepoPath $Folder $ToRepoPath"
Aber das fühlt sich an wie eine böse und unnötige Abhilfe.
Gibt es eine Möglichkeit, Powershell beim Piping direkt zu übergeben, anstatt es zu puffern?
Versuchen 'svnadmin.exe ... | out-string | svnfilter.exe ... '? Dies kann Powershell dazu verleiten, jede Zeile zu pipen, anstatt alles zu sammeln. Ich habe kein SVN und weiß es auch nicht, also entschuldige mich, wenn das schrecklich bricht. – Eris