我必须创建基于 WinSCP 和 Windows 批处理脚本的解决方案。以下是脚本必须执行的任务:
/command
) 在命令模式 (/script=name_of_script_file.txt
) 下运行 WinSCP,并从先前生成的列表中获取文件(get
命令)。 最重要的是获取文件列表,保存它并将创建的文件中的文件名传递给WinSCP以获取它们。
如何实施?
仅使用 WinSCP 脚本 没有简单的方法来实现此目的。有可能,请参阅我答案的最后,但这可能不是一个理想的解决方案。
为什么要分两步进行?为什么不直接下载目录呢?
winscp.com /command ^
"option batch abort" ^
"option confirm off" ^
"open scp://user:[email protected]/" ^
"get /path/*" ^
"exit"
如果您确实需要该列表(例如,用于进一步处理),您可以获取实际下载的文件列表,而不是获取目录中的文件列表。
启用 XML 日志记录,并从 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 处理器:
Microsoft
msxsl.exe
(已弃用,但可从互联网档案馆获取)
msxsl.exe log.xml download.xslt
xsltproc.exe
:
xsltproc.exe download.xslt log.xml
你会得到:
/path/file1.txt
/path/file2.txt
请参阅 使用 XSLT 转换将 XML 日志转换为文本输出。
回答您的实际问题。如果您确实坚持要获取文件列表并根据它下载文件,我建议您使用来自 PowerShell 脚本的 WinSCP .NET 程序集。
使用
Session.ListDirectory
检索远程目录的内容。
Session.ListDirectory
文档 及其示例代码。
Session.EnumerateRemoteFiles
。
迭代结果并为每个文件调用
Session.GetFiles
。
Session.GetFiles
文档 及其示例代码。
如果您喜欢简单的脚本:
可靠地获取远程文件的纯文本列表的唯一方法是使用 XML 日志记录来捕获
ls
脚本命令的输出:
winscp.com /xmllog=log.xml /command ^
"option batch abort" ^
"option confirm off" ^
"open scp://user:[email protected]/" ^
"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 脚本根据纯文本列表下载文件,请参阅脚本示例上传文件列表。它用于上传,但只需将
put
替换为 get
并颠倒参数顺序即可将其转换为下载。
请注意,
/command
参数不会进入“命令”(脚本?)模式。它用于在命令行上传递脚本命令(如我的答案中所使用的)。您正在使用脚本文件 (/script
)。向其中添加空的 /command
参数是没有意义的。
请参阅WinSCP脚本命令行参数的文档。