从PowerShell使用WinSCP .NET程序集时,“找不到类型[WinSCP.RemotePath]”

时间:2019-02-20 20:52:03

标签: powershell ftp winscp winscp-net

我正在尝试使用WinSCP .NET程序集下载最后修改的文件,这是ETL过程的一部分。我被困住了,因为我对Powershell脚本几乎一无所知。

到目前为止,这是我在Windows 10 PowerShell中尝试过的操作:

param (
    $localPath = "C:\download\*",
    $remotePath = "/home/folder/"
)

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"  
    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::ftp
        HostName = "xxx.xxx.xxx.xxx"
        UserName = "XXXXXXXX"
        Password = "xxxxxxx"
        }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Get list of files in the directory
        $directoryInfo = $session.ListDirectory($remotePath)

        # Select the most recent file
        $latest =
            $directoryInfo.Files |
            Where-Object { -Not $_.IsDirectory } |
            Sort-Object LastWriteTime -Descending |
            Select-Object -First 1

        # Any file at all?
        if ($latest -eq $Null)
        {
            Write-Host "No file found"
            exit 1
        }

        # Download the selected file

        $session.GetFiles(
            [WinSCP.RemotePath]::EscapeFileMask($latest.FullName), $localPath).Check()
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch
{
    Write-Host "Error: $($_.Exception.Message)"
}

我一直在尝试调试它,发现它一直运行到$session.GetFiles调用为止,并输出以下错误:

  

错误:找不到类型[WinSCP.RemotePath]。

我不知道为什么会这样。

2 个答案:

答案 0 :(得分:0)

这只是关闭,因为该模块确实没有被看到。

请尝试使用MS PowerShellGallery中的包装器作为此工作的一部分,以进行验证或代替您使用的包装器。

Find-Module -Name WinScp* | ft -a

Version  Name   Repository Description                          
-------  ----   ---------- -----------                          
5.13.7.0 WinSCP PSGallery  PowerShell Module Wrapper for WinSCP.

即使在WinSCP网站上有使用说明,也与您在此处显示的内容略有不同:

  

https://winscp.net/eng/docs/library_powershell#loading

     

加载程序集PowerShell脚本需要先加载程序集   它可以使用程序集公开的类。要加载程序集,请使用Add-Type   cmdlet

Add-Type -Path "WinSCPnet.dll"
  

如果您需要从其他目录运行脚本,则需要   指定程序集的完整路径。您可以从   $ PSScriptRoot自动变量使用脚本文件路径:5

Add-Type -Path (Join-Path $PSScriptRoot "WinSCPnet.dll")
  

如果编写的脚本打算用作WinSCP扩展   (自定义命令),则可以使用安装的程序集的副本   与WinSCP。在这种情况下,您可以使用WINSCP_PATH环境   变量来解析程序集的路径。允许脚本运行   即使在WinSCP之外,您也应该回到$ PSScriptRoot   方法(如上),如果未定义变量:

$assemblyPath = if ($env:WINSCP_PATH) { $env:WINSCP_PATH } else { $PSScriptRoot }
Add-Type -Path (Join-Path $assemblyPath "WinSCPnet.dll")

在调试和验证过程中。尝试将引用放在脚本的顶部。

Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 

param (
    $localPath = "C:\download\",
    $remotePath = "/home/folder/"
)

...

答案 1 :(得分:0)

当您遇到WinSCP.RemotePath而不是先前使用过的WinSCP类(例如WinSCP.SessionOptionsWinSCP.Session的问题时,您很可能使用的是旧版本的WinSCP .NET程序集已有WinSCP.RemotePath class

确保更新到程序集的最新版本。