问题描述
我有这个 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
}