gabebu
Goto Top

Telnet Output auf mehreren Zeilen

Hallo Zusammen

Ich habe etwas Probleme mit der Ausgabe eines bestimmten Scripts, so ist es jetzt:
#This script retrieves ampere figures from APC-PDUs based on telnet/TCP.
 
$TelnetServers = @("10.202.77.244","10.202.77.247","10.202.77.243","10.202.77.242","10.202.77.251","10.202.77.241","10.202.77.239","10.202.77.240","10.202.77.236","10.202.77.237","10.202.77.235","10.202.77.234","10.202.77.237","10.202.77.233","10.202.77.232","10.202.77.231")  
$TelnetPort = "23"  
$CsvFilePath = $PSCommandPath.substring(0, $PSCommandPath.length - 4) + ".csv"  
$csvRow = (Get-Date -Format "dd.MM.yyyy HH:mm;")  

Foreach($TelnetServer in $TelnetServers)
{
	Write-Output("Processing PDU with IP " + $TelnetServer)  
	$tcpConnection = New-Object System.Net.Sockets.TcpClient($TelnetServer, $TelnetPort)
	$tcpStream = $tcpConnection.GetStream()
	$tcpReader = New-Object System.IO.StreamReader($tcpStream)
	$tcpWriter = New-Object System.IO.StreamWriter($tcpStream)

	Start-Sleep -Milliseconds 200
	$tcpWriter.WriteLine("apc") | Out-Null  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$tcpWriter.WriteLine("apc") | Out-Null  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$tcpWriter.WriteLine("Phreading all current") | Out-Null  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$searching = $true
	while ($searching) {
		$tcpWriter.WriteLine("")  
		$tcpWriter.Flush()
		Start-Sleep -Milliseconds 200
		while ($tcpStream.DataAvailable)
		{
			$text = $tcpReader.ReadLine()
			if ($text.StartsWith("1: ") -or $text.StartsWith("2: ") -or $text.StartsWith("3: "))  
			{
				if ($text.StartsWith("3: "))  
				{
					$searching = $false
				}
			
				$ampere = $text.Substring(3, $text.length - 5)
				$csvRow += ($ampere + ";") #| Export-CSV -Path C:\users\output.csv -Append  
				Write-Output $ampere
			}
		}
	}

	$tcpWriter.WriteLine("exit")  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$tcpReader.Close()
	$tcpWriter.Close()
	$tcpConnection.Close()
}

Add-Content $CsvFilePath $csvRow

Soweit funktioniert es, nur ist die Ausgabe eine einzelne Zeile und nicht wirklich leserlich. Deswegen würde ich gerne für jede IP-Adresse mit den drei Werten eine neue Zeile beginnen. Das habe ich versucht:

#This script retrieves ampere figures from APC-PDUs based on telnet/TCP.
 
$TelnetServers = @("10.202.77.244","10.202.77.247","10.202.77.243","10.202.77.242","10.202.77.251","10.202.77.241","10.202.77.239","10.202.77.240","10.202.77.236","10.202.77.237","10.202.77.235","10.202.77.234","10.202.77.237","10.202.77.233","10.202.77.232","10.202.77.231")  
$TelnetPort = "23"  
$CsvFilePath = $PSCommandPath.substring(0, $PSCommandPath.length - 4) + ".csv"  
$csvRow = (Get-Date -Format "dd.MM.yyyy HH:mm;")  

Foreach($TelnetServer in $TelnetServers)
{
	Write-Output("Processing PDU with IP " + $TelnetServer)  
	$tcpConnection = New-Object System.Net.Sockets.TcpClient($TelnetServer, $TelnetPort)
	$tcpStream = $tcpConnection.GetStream()
	$tcpReader = New-Object System.IO.StreamReader($tcpStream)
	$tcpWriter = New-Object System.IO.StreamWriter($tcpStream)

	Start-Sleep -Milliseconds 200
	$tcpWriter.WriteLine("apc") | Out-Null  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$tcpWriter.WriteLine("apc") | Out-Null  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$tcpWriter.WriteLine("Phreading all current") | Out-Null  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$searching = $true
	while ($searching) {
		$tcpWriter.WriteLine("")  
		$tcpWriter.Flush()
		Start-Sleep -Milliseconds 200
		while ($tcpStream.DataAvailable)
		{
			$text = $tcpReader.ReadLine()
			if ($text.StartsWith("1: ") -or $text.StartsWith("2: ") -or $text.StartsWith("3: "))  
			{
				if ($text.StartsWith("3: "))  
				{
					$searching = $false
				}
			
				$ampere = $text.Substring(3, $text.length - 5)
				$csvRow += ($ampere + ";") | Export-CSV -Path C:\users\output.csv -Append  
				Write-Output $ampere
			}
		}
	}

	$tcpWriter.WriteLine("exit")  
	$tcpWriter.Flush()
	Start-Sleep -Milliseconds 200

	$tcpReader.Close()
	$tcpWriter.Close()
	$tcpConnection.Close()
}

#Add-Content $CsvFilePath $csvRow

Der Versuch war, die ausgabe ($csvRow += ($ampere + ";") | Export-CSV -Path C:\users\output.csv -Append) mit Export-CSV auszugeben, damit neue Zeilen erstellt werden, aber irgendwie werden nur irgendwelche zufälligen Zahlen ausgegeben.

Könnt ihr mir sagen, was ich falsch mache?

Besten Dank für eure Auskunft.


Gruss,


Gabriel

Content-ID: 612353

Url: https://administrator.de/contentid/612353

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

BirdyB
BirdyB 13.10.2020 um 11:23:23 Uhr
Goto Top
Moin,

die Funktion Export-CSV nimmt ein Objekt und wandelt dieses dann in eine CSV um. Du versuchst hier aber bereits deinen fertigen CSV-String in die Funktion zu übergeben. Das funktioniert so aber nicht.
Entweder du packst deine Daten in ein Objekt(-Array) und nutzt dann die Export-CSV oder aber du schreibst deinen Plaintext in die Datei.
Siehe hier: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
und hier: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Für einen der beiden Wege musst du dich entscheiden, der Mix klappt nicht.

VG
gabeBU
gabeBU 13.10.2020 um 12:39:13 Uhr
Goto Top
es ging auch viel einfacher: Add-Content $CsvFilePath $csvRow in die Schleife packen.


Gruss,


Gabriel