Faça comandos WinSCP executados de forma síncrona no PowerShell

1

Estou tentando usar o WinSCP para criar scripts de sincronização de diretórios em um local do WebDAV. Estou executando assim do PowerShell:

.\WinSCP.exe -log=.\winscp.log -command "open davs://username:[email protected]/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"

Isso funciona bem. Os arquivos estão sincronizados. Eu deletei o diretório WebDAV e executei novamente para ver se os arquivos estão lá.

O problema é que o WinSCP está saindo antes da conclusão da sincronização. Você pode ver isso verificando a hora atual após a conclusão e comparando com o último registro de data e hora no arquivo de registro.

Este é um comando do PowerShell que demonstra o problema:

& {
.\WinSCP.exe -log=.\winscp.log -command "open davs://username:[email protected]/" "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
}

Saída:

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.

Como você pode ver, o WinSCP ainda estava gravando o log por mais de 20 segundos após o comando ter sido encerrado. Isso não faz muito sentido. Como o WinSCP pode determinar se o comando funcionou antes de terminar? Como posso fazer o WinSCP parar e esperar que o comando termine antes de sair e antes de reportar sucesso ou falha?

    
por jpmc26 18.04.2018 / 02:46

1 resposta

1

O PowerShell não espera que os aplicativos GUI sejam concluídos antes de prosseguir para o próximo comando.

Você pode usar o truque da tubulação para resolver isso, conforme visto em Como dizer ao PowerShell para aguardar que cada comando termine antes de iniciar o próximo

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

Embora seja mais fácil usar interface de script WinSCP, winscp.com . Isso é um equivalente de console de winscp.exe

Apesar de interessante, sua sintaxe de linha de comando não produz winscp.log arquivo de log para mim em nenhum caso. O PowerShell parece corromper a linha de comando, quando - é usado para comutadores. Com / , funciona:

.\WinSCP.com /log=.\winscp.log /command "open davs://username:[email protected]/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"
    
por 18.04.2018 / 08:17