«Не удается найти тип [WinSCP.RemotePath]» при использовании сборки WinSCP .NET из PowerShell. - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь загрузить последний измененный файл, используя сборку 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 голосов
/ 21 февраля 2019

Поскольку вы получаете проблему для WinSCP.RemotePath, а не для ранее используемых классов WinSCP, таких как WinSCP.SessionOptions или WinSCP.Session, вы, скорее всего, используете старую версию сборки WinSCP .NET, в которой не было * 1005.* class еще.

Убедитесь, что вы обновили до последней версии сборки.

0 голосов
/ 21 февраля 2019

Это просто происходит, так как модуль действительно не виден.

Попробуйте использовать оболочку из 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

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/"
)

...
...