微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据用户输入从 CSV 文件中为 WinSCP .NET 程序集选择 SFTP 连接数据

如何解决根据用户输入从 CSV 文件中为 WinSCP .NET 程序集选择 SFTP 连接数据

我有这个 PowerShell 代码效果很好。但是当我向 db.csv 添加更多行时,它不起作用并返回错误代码

Exception calling "Open" with "1" argument(s): "Connection has been unexpectedly closed. Server sent command exit status 0.
Authentication log (see session log for details):
Using username "username".
Authentication Failed."
At C:\Users\me\Desktop\testeScript\CollectLog.ps1:41 char:5
+ $session.Open($sessionoptions)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [],MethodInvocationException
+ FullyQualifiedErrorId : Sessionremoteexception

例如,当我在 db.csv 中只有两行时,脚本运行良好

HostName,IP
name1,10.10.1.1
name2,10.10.1.2

我尝试在 CSV 文档中使用 19 个主机名和 Ip addr 行并工作,但是当我仅添加 1 个停止工作时。

19 件作品 20+ 不起作用..

有什么想法吗? (谢谢你,对不起我的英语)

Add-Type -Path "WinSCPnet.dll"
 
$Name = @()
$ip = @()
 
Import-Csv db.csv |`
    ForEach-Object {
        $Name += $_.HostName
        $ip += $_.IP
    }
 
$inputID = Read-Host -Prompt "Type ID"
 
if ($Name -contains $inputID)
    {
    $Where = [array]::IndexOf($Name,$inputID)
    Write-Host "IP: " $ip[$Where]
    }
 
# Set up session options
$sessionoptions = New-Object WinSCP.Sessionoptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "$ip"
    UserName = "username"
    Password = "password"
    GiveUpSecurityAndAcceptAnySshHostKey = "true"
}
 
$session = New-Object WinSCP.Session
 
try
{
    # Connect
    $session.Open($sessionoptions)
 
    # Transfer files
    $session.GetFiles("/C:/Program Files/Common Files/logs/Device.log","E:\loguri\Log\Arhive\*").Check()
}
finally
{
    $session.dispose()
}
 
Compress-Archive -Path "E:\loguri\Log\Arhive\Device.log" -DestinationPath "E:\loguri\Log\Arhive\$inputID.zip" -Update
Remove-Item -Path "E:\loguri\Log\Arhive\Device.log" -Force

解决方法

正如 Theo 所说,您无需像现在这样将 CSV 分成两个数组。像这样导入

$db = import-csv 'db.csv'

您可以将每一行作为 $db[0]$db[1] 访问,并且您的 CSV 中的每一列都将是一个属性,例如$db[0].Hostname$db[0].IP

读入输入后,您只需从数组 $db 中选择条目。也许像这样。但是,您和我的代码都没有涵盖不匹配的情况!

$entry = $db -match $inputID

那么你的会话将被定义为这样

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Scp
    HostName = $entry.ip
    UserName = "username"
    Password = "password"
    GiveUpSecurityAndAcceptAnySshHostKey = "true"
}

综上所述,鉴于您收到的错误消息,用户名/密码和 ip 的组合似乎无效。

Add-Type -Path "WinSCPnet.dll"
 
$db = import-csv 'db.csv'
 
$inputID = Read-Host -Prompt "Type ID"
 
$entry = $db -match $inputID
 
# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = $entry.IP
    UserName = "username"
    Password = "password"
    GiveUpSecurityAndAcceptAnySshHostKey = "true"
}
 
$session = New-Object WinSCP.Session
 
try {
    # Connect
    $session.Open($sessionOptions)
 
    # Transfer files
    $session.GetFiles("/C:/Program Files/Common Files/logs/Device.log","E:\loguri\Log\Arhive\*").Check()
}
finally {
    $session.Dispose()
}

if (Test-Path "E:\loguri\Log\Arhive\Device.log") {
  Compress-Archive -Path "E:\loguri\Log\Arhive\Device.log" -DestinationPath "E:\loguri\Log\Arhive\$inputID.zip" -Update
  Remove-Item -Path "E:\loguri\Log\Arhive\Device.log" -Force
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。