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

Powershell 根据用户输入,从CSV文件中选择WinSCP.NET程序集的SFTP连接数据,powershell,csv,sftp,winscp,Powershell,Csv,Sftp,Winscp,我有这个PowerShell代码。 效果很好。但当我向db.csv添加更多行时,它不起作用并返回错误代码: 使用“1”参数调用“Open”时出现异常:“连接已意外关闭。服务器已发送命令退出状态0。 身份验证日志(有关详细信息,请参阅会话日志): 使用用户名“username”。 身份验证失败。“ 在C:\Users\me\Desktop\testeScript\CollectLog.ps1:41 char:5 +$session.Open($sessionOptions) + ~~~~~~~~~

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

使用“1”参数调用“Open”时出现异常:“连接已意外关闭。服务器已发送命令退出状态0。
身份验证日志(有关详细信息,请参阅会话日志):
使用用户名“username”。
身份验证失败。“
在C:\Users\me\Desktop\testeScript\CollectLog.ps1:41 char:5
+$session.Open($sessionOptions)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:NotSpecified:(:)[],MethodInvocationException
+FullyQualifiedErrorId:SessionRemoteException
例如,当我在
db.csv
中只有两行时,脚本工作得非常好

主机名,IP地址 名称1,10.10.1.1 名称2,10.10.1.2 我尝试在CSV文档中使用19个主机名和Ip地址行,但当我只添加1个时,停止工作

19件作品 20+不起作用

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


正如西奥所说,您不需要像以前那样将CSV分成两个阵列。像这样导入它

$db = import-csv 'db.csv'
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Scp
    HostName = $entry.ip
    UserName = "username"
    Password = "password"
    GiveUpSecurityAndAcceptAnySshHostKey = "true"
}
您可以作为
$db[0]
$db[1]
访问每一行,CSV中的每一列都将是一个属性,例如
$db[0]。主机名
$db[0]。IP

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

$entry = $db -match $inputID
然后您的会话将被定义为这样

$db = import-csv 'db.csv'
$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
}

为什么要将csv中的数据拆分为两个单独的阵列?在
try{..}finally{..}
之间添加一个
catch{}
块,以解决问题
$\uu0.Exception.Message
感谢您的响应,您能准确地向我展示您的脚本想法吗?(我真的是个新手,现在我试着学习)提前谢谢你:DI separete CSV,因为我需要在捕获通信后输入一个ID。(?)因此,根据示例:我有db.csv(格式化主机名,IP)第1行:名称,第2行名称后的10.10.10.10,第2行名称,第10.10.10.11和更多的数百行。没关系,您的csv可以有数百行:主机名,IP host1192.168.1.1 host2192.168.1.2 host3192.168.1.3 host4192.168.1.4 host5192.168.1.5 host6192.168.1.6 host7192.168.1.7 host8192.168.1.8 host9192.168.1.9 host10192.168.1.10。。。hosn,a.b.c.d.你会用同样的方法导入它$mydb=inport csv db.csv您还可以在数据库中循环以自动收集所有计算机的所有日志,而无需指定名称。例如:
$db=import csv'db.csv';foreach($db中的主机){$sessionoptions…..主机名=$host.ip….etc}
如果每个主机都有不同的用户名和密码,您可以使用包含用户名和密码附加列的CSV对其进行进一步扩展,然后您的
$sessionOptions
可以通过
username=$host.username
password=$host.password
主机具有相同的用户名和密码来反映这一点。你能编辑我的脚本吗?我真的不知道该怎么做:|。