WinSCP 脚本通过将命令提供给 JScript 中的 StdIn - 脚本挂起且永远不会完成



我正在尝试从SFTP服务器下载大约40个文件,但它只下载了其中的30个文件并挂起。
请帮助解决问题。

这是我正在使用的脚本。

var exec = shell.Exec("winscp.com /xmllog="C:\download\log\download.xml" "); 
exec.StdIn.Write( 
    "option batch abortn"+ 
    "option confirm offn"+ 
    "open sftp://xxx:xxx@xxx -hostkey="xxxx" n"+ 
    "get /download/* "C:\download\" n"+ 
    "exit"); 

请参阅下面的日志。
我在日志文件中找不到任何问题:

> 2017-10-18 13:09:10.232 Type: SSH_FXP_REMOVE, Size: 54, Number: 99341
< 2017-10-18 13:09:10.233 Type: SSH_FXP_STATUS, Size: 24, Number: 99076
. 2017-10-18 13:09:10.233 Discarding reserved response
< 2017-10-18 13:09:10.235 Type: SSH_FXP_STATUS, Size: 24, Number: 99341
< 2017-10-18 13:09:10.235 Status code: 0
. 2017-10-18 13:09:10.236 File: '/compliance/2016_QTR2_DepreciationSummary.xlsx' [2017-10-18T17:07:08.000Z] [19819]
. 2017-10-18 13:09:10.236 Copying "/compliance/2016_QTR2_DepreciationSummary.xlsx" to local directory started.
. 2017-10-18 13:09:10.236 Binary transfer mode selected.
. 2017-10-18 13:09:10.236 Opening remote file.
> 2017-10-18 13:09:10.236 Type: SSH_FXP_OPEN, Size: 63, Number: 99587
< 2017-10-18 13:09:10.239 Type: SSH_FXP_HANDLE, Size: 13, Number: 99587
> 2017-10-18 13:09:10.239 Type: SSH_FXP_FSTAT, Size: 13, Number: 99848
< 2017-10-18 13:09:10.241 Type: SSH_FXP_ATTRS, Size: 37, Number: 99848
> 2017-10-18 13:09:10.242 Type: SSH_FXP_READ, Size: 25, Number: 100101
< 2017-10-18 13:09:10.250 Status code: 1
. 2017-10-18 13:09:10.250 3 skipped SSH_FXP_WRITE, SSH_FXP_READ, SSH_FXP_DATA and SSH_FXP_STATUS packets.
> 2017-10-18 13:09:10.250 Type: SSH_FXP_CLOSE, Size: 13, Number: 100612
. 2017-10-18 13:09:10.250 Preserving timestamp [2017-10-18T17:07:08.000Z]
. 2017-10-18 13:09:10.251 Transfer done: '/compliance/2016_QTR2_DepreciationSummary.xlsx' => 'C:UsersArmanDesktopWorkpwcfinalserverscomerit_final_download_from_sftpsrcmainwebappcompliance2016_QTR2_DepreciationSummary.xlsx' [19819]
. 2017-10-18 13:09:10.251 Deleting file "/compliance/2016_QTR2_DepreciationSummary.xlsx".
> 2017-10-18 13:09:10.251 Type: SSH_FXP_REMOVE, Size: 55, Number: 100877
< 2017-10-18 13:09:10.253 Type: SSH_FXP_STATUS, Size: 24, Number: 100612
. 2017-10-18 13:09:10.253 Discarding reserved response
< 2017-10-18 13:09:10.256 Type: SSH_FXP_STATUS, Size: 24, Number: 100877
< 2017-10-18 13:09:10.256 Status code: 0
. 2017-10-18 13:09:10.256 File: '/compliance/2016_QTR2_GainLossSummary.pdf' [2017-10-18T17:07:08.000Z] [120260]
< 2017-10-18 13:09:37.004 Script: Terminated by user.
. 2017-10-18 13:09:37.004 Copying "/compliance/2016_QTR2_GainLossSummary.pdf" to local directory started.
. 2017-10-18 13:09:37.004 Binary transfer mode selected.
. 2017-10-18 13:09:37.004 Checking existence of partially transferred file.
. 2017-10-18 13:09:37.005 Opening remote file.
> 2017-10-18 13:09:37.005 Type: SSH_FXP_OPEN, Size: 58, Number: 101123
< 2017-10-18 13:09:37.009 Type: SSH_FXP_HANDLE, Size: 13, Number: 101123
> 2017-10-18 13:09:37.009 Type: SSH_FXP_FSTAT, Size: 13, Number: 101384
< 2017-10-18 13:09:37.012 Type: SSH_FXP_ATTRS, Size: 37, Number: 101384
> 2017-10-18 13:09:37.013 Type: SSH_FXP_READ, Size: 25, Number: 101637
. 2017-10-18 13:09:37.047 9 skipped SSH_FXP_WRITE, SSH_FXP_READ, SSH_FXP_DATA and SSH_FXP_STATUS packets.
> 2017-10-18 13:09:37.047 Type: SSH_FXP_CLOSE, Size: 13, Number: 102916
> 2017-10-18 13:09:37.048 Script: exit
. 2017-10-18 13:09:37.048 Script: Exit code: 0
. 2017-10-18 13:09:37.048 Closing connection.
. 2017-10-18 13:09:37.048 Sending special code: 12
. 2017-10-18 13:09:37.048 Sent EOF message

这是添加"var output = exec"后的完整工作代码。StdOut.ReadAll();"

var exec = shell.Exec("winscp.com /log="C:\log\download.log" ");
exec.StdIn.Write(
    "option batch abortn"+
    "option confirm offn"+
    "open sftp://xxx:xxx@xxx  -hostkey="xxx" n"+
    "get -delete /compliance/* "C:\compliance\"  n"+
    "exit");
exec.StdIn.Close();
var output = exec.StdOut.ReadAll();

谢谢
阿尔曼

你没有向我们展示,你在exec.StdIn.Write()之后做了什么.

确保阅读程序输出,例如像这样(如访问输入/输出流的官方 JScript 示例)显示:

var output = exec.StdOut.ReadAll();

另请参阅捕获 WinSCP 进程的输出(相同的问题,但适用于 C#):

您需要在脚本运行时持续收集输出。输出流的容量有限。一旦它被填满,WinSCP 就会挂起等待可用空间,永远不会完成。


除上述内容外,您还必须使用 n 终止 exit 命令。尽管在您的情况下,使用标准输入提供命令没有多大意义。只需在WinSCP命令行上使用/command开关即可。

最新更新