1

Я пытаюсь использовать WinSCP для сценария синхронизации каталогов с местоположением WebDAV. Я запускаю это так из PowerShell:

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

Это отлично работает. Файлы синхронизируются. Я удалил каталог WebDAV и повторно запустил его, чтобы увидеть, что файлы составляют его там.

Проблема в том, что WinSCP завершает работу до завершения синхронизации. Вы можете убедиться в этом, проверив текущее время после его окончания и сравнив его с последней отметкой времени в файле журнала.

Вот команда PowerShell, которая демонстрирует проблему:

& {
.\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
}

Выход:

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.

Как видите, WinSCP все еще записывал журнал через 20 секунд после выхода из команды. Это не имеет большого смысла. Как WinSCP может определить, сработала ли команда до ее завершения? Как я могу заставить WinSCP остановиться и дождаться завершения команды до ее выхода и до того, как она сообщит об успехе или неудаче?

1 ответ1

1

PowerShell не ожидает завершения работы приложений с графическим интерфейсом, прежде чем перейти к следующей команде.

Чтобы решить эту проблему, можно использовать трюк с конвейером, как показано в разделе Как заставить PowerShell ждать завершения каждой команды перед началом следующей?

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

Хотя проще использовать интерфейс сценариев WinSCP, winscp.com . Это консольный эквивалент winscp.exe


Хотя интересно, что ваш синтаксис командной строки не создает файл журнала winscp.log для меня в любом случае. Кажется, что PowerShell повреждает командную строку, когда - используется для коммутаторов. С / работает:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .