WinSCP-Befehle in PowerShell synchron ausführen

732
jpmc26

Ich versuche, WinSCP zu verwenden, um eine Verzeichnissynchronisierung mit einem WebDAV-Speicherort durchzuführen. Ich führe es von PowerShell aus so aus:

.\WinSCP.exe -log=.\winscp.log -command "open davs://username:password@www.example.com/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit" 

Das funktioniert gut. Die Dateien werden synchronisiert. Ich habe das WebDAV-Verzeichnis gelöscht und erneut ausgeführt, um zu sehen, dass die Dateien dort vorhanden sind.

Das Problem ist, dass WinSCP beendet wird, bevor die Synchronisierung abgeschlossen ist. Sie können dies sehen, indem Sie die aktuelle Uhrzeit nach dem Ende überprüfen und mit dem letzten Zeitstempel in der Protokolldatei vergleichen.

Hier ist ein PowerShell-Befehl, der das Problem demonstriert:

& { .\WinSCP.exe -log=.\winscp.log -command "open davs://username:password@www.example.com/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit" Get-Date Write-Host 'Exit code:' $LASTEXITCODE Start-Sleep -Seconds 30 Get-Content -Tail 6 .\WinSCP.log } 

Ausgabe:

Tuesday, April 17, 2018 20:41:52 Exit code: 0 . 2018-04-17 20:42:15.025 Copying finished: Transferred: 177, Elapsed: 0:00:20, CPS: 9/s > 2018-04-17 20:42:15.025 Script: exit . 2018-04-17 20:42:15.025 Script: Exit code: 0 . 2018-04-17 20:42:15.025 sess: Destroying session. . 2018-04-17 20:42:15.025 sess: Closing connection. . 2018-04-17 20:42:15.025 sess: Connection closed. 

Wie Sie sehen, schrieb WinSCP das Protokoll immer noch über 20 Sekunden, nachdem der Befehl beendet wurde. Das macht nicht viel Sinn. Wie kann WinSCP feststellen, ob der Befehl vor dem Abschluss funktioniert hat? Wie kann ich WinSCP anhalten und warten, bis der Befehl beendet ist, bevor er beendet wird und bevor Erfolg oder Misserfolg gemeldet wird?

1

1 Antwort auf die Frage

1
Martin Prikryl

PowerShell wartet nicht auf den Abschluss der GUI-Anwendungen, bevor Sie mit dem nächsten Befehl fortfahren.

Sie können dieses Problem mithilfe des Piping-Tricks lösen. Informationen hierzu finden Sie unter So können Sie PowerShell anweisen, bis der Befehl beendet ist, bevor der nächste Befehl gestartet wird.

.\WinSCP.exe ... | Out-Null 

Die WinSCP-Skriptschnittstellewinscp.com ist jedoch einfacher zu verwenden . Das ist ein Konsolenäquivalent vonwinscp.exe


Interessanterweise erzeugt Ihre Befehlszeilensyntax winscp.logauf keinen Fall eine Protokolldatei für mich. PowerShell scheint die Befehlszeile zu beschädigen, wenn -sie für Schalter verwendet wird. Mit /klappt es:

.\WinSCP.com /log=.\winscp.log /command "open davs://username:password@www.example.com/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit" 
Ich glaube, ich könnte dies in der Eingabeaufforderung reproduzieren. Ich habe mich gerade für PowerShell entschieden, um den Zeitstempel auszuspucken und die Datei zu lesen. (Das macht das Einfügen der gesamten Befehlssequenz auf einmal einfacher, wenn man den Schlaf bedenkt.) Aber ich muss morgen einen neuen Test durchführen, da ich gerade nicht auf derselben Maschine bin. jpmc26 vor 6 Jahren 0
Wenn Sie die GUI-Anwendung über die Windows-Befehlszeile (`cmd.exe`) ausführen, wird die Aufforderung in der Tat nicht blockiert. Es wird jedoch blockiert, wenn es von der .bat-Datei ausgeführt wird. Verwenden Sie erneut "winscp.com", um das Problem zu lösen. Martin Prikryl vor 6 Jahren 0
Vielen Dank. Nicht sicher, was mit dem `-` vs.` / `Problem los ist. Ich weiß, dass die Dokumente meistens "/" sagen, aber ich versuche in der Regel bei allen ausführbaren Aufrufen "-" und ziehe es vor, wenn es funktioniert, da Schrägstriche für andere Zwecke verwendet werden (z. B. für Verzeichnisseparatoren). Beides zu unterstützen scheint nicht ungewöhnlich zu sein. Verwenden Sie die neueste Version (5.13.1 (Build 8265))? jpmc26 vor 6 Jahren 0
Es geht nicht um WinSCP. WinSCP ist zufrieden mit `-`. Wenn ich jedoch Ihr exaktes PowerShell-Skript ausführte, sehe ich im Task-Manager, dass PowerShell ein Leerzeichen zwischen -log = `und`. \ Winscp.log` fügt. https://i.stack.imgur.com/s1t30.png Was nicht funktioniert. WinSCP betrachtet `. \ Winscp.log` als einen Hostnamen, zu dem eine Verbindung hergestellt werden kann, was zu einem Fehler führt (die Skriptdatei wird jedoch trotzdem ausgeführt, es findet jedoch keine Protokollierung statt). Wenn ich `-` durch` / `ersetze, wird kein Leerzeichen hinzugefügt. Martin Prikryl vor 6 Jahren 0
Möglicherweise unterscheidet sich die PowerShell-Version? Etwas anderes, das möglicherweise korrigiert werden könnte, ist das gesamte Argument zu zitieren, um die Verarbeitung des Befehls durch PowerShell zu minimieren. Wenn das für Sie funktioniert, kann ich die Frage aktualisieren. jpmc26 vor 6 Jahren 0
Das ist in Ordnung, es ist nicht wirklich ein Kernteil der Frage. Martin Prikryl vor 6 Jahren 0