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

时间:2015-01-29 20:55:16

标签: batch-file batch-processing scp winscp

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

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

    如何实现?

1 个答案:

答案 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>&#xa;</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


如果您喜欢简单的脚本:

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

你得到:

file1.txt
file2.txt

要使WinSCP脚本根据纯文本列表下载文件,请参阅脚本示例Uploading a list of files。它是上传的,但只需将put替换为get并反转参数顺序即可将其下载。


请注意,/command参数未输入&#34;命令&#34; (脚本?)模式。它是在命令行上传递脚本命令(在我的回答中使用)。您正在使用脚本文件(/script)。没有必要为其添加空/command参数。

请参阅WinSCP scripting command-line parameters的文档。