Bulk test many Servers in WinSCP.ini - How to?
Does anyone know how to test servers which are saved in WinSCP.ini in bulk? i have made a script with ChatGPT but maybe there is a better solution to this?!
I attach the script to this message :)
WinSCP_Bulk_tester.ps1:
# Set paths
$iniPath = "C:\Users\acen\Documents\WinSCP.ini"
$winscpPath = "C:\Program Files (x86)\WinSCP\winscp.com" # Adjust if needed
$logFile = "C:\Users\acen\Documents\WinSCP_bulk_check.log"
$newIniPath = "C:\Users\acen\Documents\WinSCP_successful.ini"
$successTxtPath = "C:\Users\acen\Documents\WinSCP_successful.txt"
# Clear output files at start
Clear-Content $logFile -ErrorAction SilentlyContinue
Clear-Content $newIniPath -ErrorAction SilentlyContinue
Clear-Content $successTxtPath -ErrorAction SilentlyContinue
$iniLines = Get-Content $iniPath
$sessionSections = $iniLines | Select-String '^\[Sessions\\(.+?)\]' | ForEach-Object {
@{
Name = $_.Matches[0].Groups[1].Value
Start = $_.LineNumber
}
}
for ($i = 0; $i -lt $sessionSections.Count; $i++) {
if ($i -lt $sessionSections.Count - 1) {
$sessionSections[$i].End = $sessionSections[$i+1].Start - 1
} else {
$sessionSections[$i].End = $iniLines.Count
}
}
foreach ($section in $sessionSections) {
$sessionName = $section.Name
Write-Host "Testing $sessionName..."
$sessionLines = $iniLines[($section.Start)..($section.End-1)]
# Extract details
$hostname = ($sessionLines | Where-Object { $_ -match "^HostName=" }) -replace "^HostName=", ""
$user = ($sessionLines | Where-Object { $_ -match "^UserName=" }) -replace "^UserName=", ""
$password = ($sessionLines | Where-Object { $_ -match "^Password=" }) -replace "^Password=", ""
# Always use SCP protocol
$protocolStr = "scp"
# Build open command with hostkey=*
if ($password -ne "") {
$openCmd = "open ${protocolStr}://${user}:${password}@${hostname}/ -hostkey=*"
} else {
$openCmd = "open ${protocolStr}://${user}@${hostname}/ -hostkey=*"
}
# Run WinSCP and capture output
$result = & "$winscpPath" /command "$openCmd" "exit" 2>&1
# Append session header and result to log file
Add-Content $logFile "`n===== $sessionName ====="
Add-Content $logFile $result
# Improved error handling and output
if ($result -match "Authentication failed" -or $result -match "Access denied" -or $result -match "Zugriff verweigert" -or $result -match "Anmeldung fehlgeschlagen") {
Write-Host "${sessionName}: Credential FAILED" -ForegroundColor Red
} elseif ($result -match "Connection failed" -or $result -match "Timeout" -or $result -match "Host not found" -or $result -match "Network error" -or $result -match "Connection refused" -or $result -match "Could not resolve hostname" -or $result -match "No route to host") {
Write-Host "${sessionName}: Server UNREACHABLE" -ForegroundColor Red
} elseif ($result -match "Session opened" -or $result -match "Sitzung gestartet") {
Write-Host "${sessionName}: Connection OK" -ForegroundColor Green
# Write session section to new INI file
Add-Content $newIniPath "`n[Sessions\$sessionName]"
foreach ($line in $sessionLines) {
Add-Content $newIniPath $line
}
# Write session name to TXT file
Add-Content $successTxtPath $sessionName
} elseif ($result -match "Die Gegenstelle sendet seit mehr als 15 Sekunden keine Daten mehr") {
Write-Host "${sessionName}: Connection hangs, possible network/server issue" -ForegroundColor Red
} elseif ($result -match "SFTP kann nicht initialisiert werden") {
Write-Host "${sessionName}: SFTP not available, SCP should work if server supports it" -ForegroundColor Red
} else {
Write-Host "${sessionName}: Unknown result, check log file" -ForegroundColor Red
}
}
I attach the script to this message :)
WinSCP_Bulk_tester.ps1:
# Set paths
$iniPath = "C:\Users\acen\Documents\WinSCP.ini"
$winscpPath = "C:\Program Files (x86)\WinSCP\winscp.com" # Adjust if needed
$logFile = "C:\Users\acen\Documents\WinSCP_bulk_check.log"
$newIniPath = "C:\Users\acen\Documents\WinSCP_successful.ini"
$successTxtPath = "C:\Users\acen\Documents\WinSCP_successful.txt"
# Clear output files at start
Clear-Content $logFile -ErrorAction SilentlyContinue
Clear-Content $newIniPath -ErrorAction SilentlyContinue
Clear-Content $successTxtPath -ErrorAction SilentlyContinue
$iniLines = Get-Content $iniPath
$sessionSections = $iniLines | Select-String '^\[Sessions\\(.+?)\]' | ForEach-Object {
@{
Name = $_.Matches[0].Groups[1].Value
Start = $_.LineNumber
}
}
for ($i = 0; $i -lt $sessionSections.Count; $i++) {
if ($i -lt $sessionSections.Count - 1) {
$sessionSections[$i].End = $sessionSections[$i+1].Start - 1
} else {
$sessionSections[$i].End = $iniLines.Count
}
}
foreach ($section in $sessionSections) {
$sessionName = $section.Name
Write-Host "Testing $sessionName..."
$sessionLines = $iniLines[($section.Start)..($section.End-1)]
# Extract details
$hostname = ($sessionLines | Where-Object { $_ -match "^HostName=" }) -replace "^HostName=", ""
$user = ($sessionLines | Where-Object { $_ -match "^UserName=" }) -replace "^UserName=", ""
$password = ($sessionLines | Where-Object { $_ -match "^Password=" }) -replace "^Password=", ""
# Always use SCP protocol
$protocolStr = "scp"
# Build open command with hostkey=*
if ($password -ne "") {
$openCmd = "open ${protocolStr}://${user}:${password}@${hostname}/ -hostkey=*"
} else {
$openCmd = "open ${protocolStr}://${user}@${hostname}/ -hostkey=*"
}
# Run WinSCP and capture output
$result = & "$winscpPath" /command "$openCmd" "exit" 2>&1
# Append session header and result to log file
Add-Content $logFile "`n===== $sessionName ====="
Add-Content $logFile $result
# Improved error handling and output
if ($result -match "Authentication failed" -or $result -match "Access denied" -or $result -match "Zugriff verweigert" -or $result -match "Anmeldung fehlgeschlagen") {
Write-Host "${sessionName}: Credential FAILED" -ForegroundColor Red
} elseif ($result -match "Connection failed" -or $result -match "Timeout" -or $result -match "Host not found" -or $result -match "Network error" -or $result -match "Connection refused" -or $result -match "Could not resolve hostname" -or $result -match "No route to host") {
Write-Host "${sessionName}: Server UNREACHABLE" -ForegroundColor Red
} elseif ($result -match "Session opened" -or $result -match "Sitzung gestartet") {
Write-Host "${sessionName}: Connection OK" -ForegroundColor Green
# Write session section to new INI file
Add-Content $newIniPath "`n[Sessions\$sessionName]"
foreach ($line in $sessionLines) {
Add-Content $newIniPath $line
}
# Write session name to TXT file
Add-Content $successTxtPath $sessionName
} elseif ($result -match "Die Gegenstelle sendet seit mehr als 15 Sekunden keine Daten mehr") {
Write-Host "${sessionName}: Connection hangs, possible network/server issue" -ForegroundColor Red
} elseif ($result -match "SFTP kann nicht initialisiert werden") {
Write-Host "${sessionName}: SFTP not available, SCP should work if server supports it" -ForegroundColor Red
} else {
Write-Host "${sessionName}: Unknown result, check log file" -ForegroundColor Red
}
}