位于文本文件中的文件列表,以脚本模式作为参数发送到 WinSCP

问题描述 投票:0回答:1

我必须创建基于 WinSCP 和 Windows 批处理脚本的解决方案。以下是脚本必须执行的任务:

  1. 将远程目录中的文件列表保存到运行批处理脚本的计算机上的文件。
  2. 使用作为参数传递的 WinSCP 脚本 (
    /command
    ) 在命令模式 (
    /script=name_of_script_file.txt
    ) 下运行 WinSCP,并从先前生成的列表中获取文件(
    get
    命令)。

最重要的是获取文件列表,保存它并将创建的文件中的文件名传递给WinSCP以获取它们。

如何实施?

batch-file batch-processing scp winscp
1个回答
4
投票

仅使用 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>&#xa;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

要处理它,请使用任何 XSLT 处理器:

你会得到:

/path/file1.txt
/path/file2.txt

请参阅 使用 XSLT 转换将 XML 日志转换为文本输出


回答您的实际问题。如果您确实坚持要获取文件列表并根据它下载文件,我建议您使用来自 PowerShell 脚本WinSCP .NET 程序集


如果您喜欢简单的脚本:

可靠地获取远程文件的纯文本列表的唯一方法是使用 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>&#xa;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

你得到:

file1.txt
file2.txt

要让 WinSCP 脚本根据纯文本列表下载文件,请参阅脚本示例上传文件列表。它用于上传,但只需将

put
替换为
get
并颠倒参数顺序即可将其转换为下载。


请注意,

/command
参数不会进入“命令”(脚本?)模式。它用于在命令行上传递脚本命令(如我的答案中所使用的)。您正在使用脚本文件 (
/script
)。向其中添加空的
/command
参数是没有意义的。

请参阅WinSCP脚本命令行参数的文档。

© www.soinside.com 2019 - 2024. All rights reserved.