我要创建基于WinSCP和Windows批处理脚本的解决方案。以下是脚本必须执行的任务:
/command
)传递的WinSCP脚本在命令模式(/script=name_of_script_file.txt
)中运行WinSCP,并从先前生成的列表中获取文件(get
命令)。 最重要的是获取文件列表,保存文件并将创建文件中的文件名称传递给WinSCP以获取它们。
如何实现?
答案 0 :(得分:2)
仅使用WinSCP scripting无法轻松实现此目的。这是可能的,看到我的答案的最后,但它可能不是一个理想的解决方案。
为什么分两步完成?为什么不直接下载目录?
winscp.com /command ^
"option batch abort" ^
"option confirm off" ^
"open scp://user:password@example.com/" ^
"get /path/*" ^
"exit"
如果您确实需要该列表(例如,进行进一步处理),您可以获取目录中的文件列表,而不是获取实际下载文件的列表。
启用XML logging,并从XML日志中获取列表。
winscp.com /xmllog=log.xml /command ^
....
您会收到如下日志:
<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="user@host" start="2015-01-30T06:45:57.008Z">
<download>
<filename value="/path/file1.txt" />
<destination value="C:\path\file1.txt" />
<result success="true" />
</download>
<download>
<filename value="/path/file2.txt" />
<destination value="C:\path\file2.txt" />
<result success="true" />
</download>
</session>
如果您需要纯文本列表,可以使用XSLT进行转换(例如download.xslt
):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:winscp="http://winscp.net/schema/session/1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match='winscp:download[winscp:result[@success="true"]]/winscp:filename'>
<xsl:value-of select="@value"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
要处理它,请使用任何XSLT处理器,例如msxsl:
msxsl.exe log.xml download.xsl
你得到:
/path/file1.txt
/path/file2.txt
请参阅Transforming XML Log to Text Output Using XSLT Transformation。
回答你的实际问题。如果您真的坚持要获取文件列表并根据它下载文件,我建议您使用WinSCP .NET assembly中的PowerShell script。
使用Session.ListDirectory
检索远程目录的内容。
请参阅Session.ListDirectory
documentation及其示例代码。
对于递归列表,您还可以使用Session.EnumerateRemoteFiles
。
迭代结果并为每个文件调用Session.GetFiles
。
请参阅Session.GetFiles
documentation及其示例代码。
如果您喜欢简单的脚本:
可靠地获取远程文件的纯文本列表的唯一方法是使用XML日志记录来捕获ls
scripting command的输出:
winscp.com /xmllog=log.xml /command ^
"option batch abort" ^
"option confirm off" ^
"open scp://user:password@example.com/" ^
"ls /path" ^
"exit"
您会收到如下日志:
<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="user@host" start="2015-01-30T07:08:27.749Z">
<ls>
<destination value="/path" />
<files>
<file>
<filename value="." />
<type value="d" />
<modification value="2014-07-28T07:06:49.000Z" />
<permissions value="rwxr-sr-x" />
</file>
<file>
<filename value=".." />
<type value="d" />
<modification value="2015-01-23T12:22:44.000Z" />
<permissions value="rwxr-xr-x" />
</file>
<file>
<filename value="file1.txt" />
<type value="-" />
<size value="1306091" />
<modification value="2015-01-29T23:58:12.000Z" />
<permissions value="rw-rw-rw-" />
</file>
<file>
<filename value="file2.txt" />
<type value="-" />
<size value="88" />
<modification value="2007-11-17T22:40:43.000Z" />
<permissions value="rw-r--r--" />
</file>
</files>
<result success="true" />
</ls>
</session>
再次,使用XSLT将XML日志转换为纯文本文件列表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:winscp="http://winscp.net/schema/session/1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match='winscp:file[winscp:type/@value="-"]/winscp:filename'>
<xsl:value-of select="@value"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
你得到:
file1.txt
file2.txt
要使WinSCP脚本根据纯文本列表下载文件,请参阅脚本示例Uploading a list of files。它是上传的,但只需将put
替换为get
并反转参数顺序即可将其下载。
请注意,/command
参数未输入&#34;命令&#34; (脚本?)模式。它是在命令行上传递脚本命令(在我的回答中使用)。您正在使用脚本文件(/script
)。没有必要为其添加空/command
参数。