WinSCP .NET程序集SynchronizeDirectories:上传文件...成功,但在设置权限和/或时间戳时发生错误

时间:2016-04-05 20:22:52

标签: powershell winscp winscp-net

我在PowerShell中使用WinSCP .NET程序集与SFTP服务器进行文件同步。我使用以下代码进行同步:
http://winscp.net/eng/docs/library_session_synchronizedirectories#powershell

问题是,当此脚本通过上传同步文件到SFTP时,它会生成错误,尽管它实际上传了该文件。脚本立即终止并出现以下错误:

  

上传C:\ FileSync \ files \ test2.txt成功

     

/Reports/test2.txt的权限保留默认值

     

设置/Reports/test2.txt的时间戳失败:
  WinSCP.SessionRemoteException:上传文件' test2.txt'成功,但在设置权限和/或时间戳时发生错误   如果问题仍然存在,请关闭设置权限或保留时间戳。或者,您可以启用“忽略权限错误”#39;选项。
  ---> WinSCP.SessionRemoteException:服务器不支持该操作   错误代码:8
  来自服务器的错误消息:SSHServerAPI.SFTP.fxp_attrs
    ---内部异常堆栈跟踪结束---

我没有找到任何方法如何"忽略权限错误"正如它在错误中建议的那样。

通过从SFTP下载文件进行同步时,脚本不会抱怨。

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

此处记录了错误:
https://winscp.net/eng/docs/message_preserve_time_perm

  • 我假设您没有启用设置权限(默认情况下已关闭)。如果您这样做,请通过设置TransferOptions.FilePermissions(见下文)将其关闭。

  • 您的服务器可能不支持更新远程文件的时间戳。这使得允许对这样的服务器进行文件的本地到远程同步变得复杂,因为时间戳是primary criteria来比较文件。

  • 通常,关闭更新时间戳与同步是没有意义的,因为更新基本上是同步的一个组成部分。

  • 基本文件传输的提示是“忽略权限错误”。如前所述,同步没有意义。

所以你能做的就是:

虽然这种同步是如何有意义的,但这是值得怀疑的。

$transferOptions = New-Object WinSCP.TransferOptions
...
$transferOptions.FilePermissions = $Null # This is default
$transferOptions.PreserveTimestamp = $False

$synchronizationResult = $session.SynchronizeDirectories(
    [WinSCP.SynchronizationMode]::Remote, "d:\www", "/home/martin/public_html",
    $False, $False, [WinSCP.SynchronizationCriteria]::Size)