我正在尝试使用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]。
我不知道为什么会这样。
答案 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.SessionOptions
或WinSCP.Session
的问题时,您很可能使用的是旧版本的WinSCP .NET程序集已有WinSCP.RemotePath
class。
确保更新到程序集的最新版本。