我正在尝试使用 WinSCP 编写针对 WebDAV 位置的目录同步脚本。我在 PowerShell 中按如下方式运行它:
.\WinSCP.exe -log=.\winscp.log -command "open davs://username:[email protected]/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"
这很好。文件已同步。我删除了 WebDAV 目录并重新运行它以查看文件是否已存在。
问题是 WinSCP 正在退出前同步完成。您可以通过在同步完成后检查当前时间并与日志文件中的最后一个时间戳进行比较来查看同步完成。
下面是演示该问题的 PowerShell 命令:
& {
.\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
}
输出:
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.
如您所见,命令退出后 20 秒内 WinSCP 仍在写入日志。这没什么道理。WinSCP 如何在命令完成之前确定命令是否有效?如何让 WinSCP 停止并等待命令完成,然后再退出并报告成功或失败?
答案1
PowerShell 不会等待 GUI 应用程序完成后再继续执行下一个命令。
您可以使用管道技巧来解决这个问题,如下图所示如何告诉 PowerShell 等待每个命令结束后再开始下一个命令?
.\WinSCP.exe ... | Out-Null
虽然更简单的是使用WinSCP 脚本接口,winscp.com
,而不是。这相当于控制台winscp.exe
但有趣的是,您的命令行语法winscp.log
无论如何都不会为我生成日志文件。当-
用于开关时,PowerShell 似乎会破坏命令行。使用/
,它可以工作:
.\WinSCP.com /log=.\winscp.log /command "open davs://username:[email protected]/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"