WinFuture-Forum.de: Batch Excel Zeilenweise auslesen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Batch Excel Zeilenweise auslesen Batch Excel Zeilenweise auslesen

#16 Mitglied ist offline   Domo991 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 09. Oktober 14
  • Reputation: 0

geschrieben 26. Oktober 2014 - 11:58

Ok ich versuche mal im ganzen darzustellen was ich überhaupt vorhabe.

Es geht darum dass ich ein Skript/Programm brauche das morgens oder zu einem bestimmten Zeitpunkt einmal ausgeführt wird (händisch oder manuell ist erstmal egal).Das Programm soll einige IP Adressen (wobei ihr schon recht habt dass es DNS Namen sind, ich dachte das tut nichts zur Sache) auf Port Ebene prüfen. Eine DNS Adresse hat immer maximal drei Ports zum Test. (Port 22-24) Jedoch ist dies nicht überall gleich. Manchmal hat die DNS nur 1 oder 2 Ports die geprüft werden müssen.

Ich dachte mir ich gehe wie folgt vor. Ich habe eine Datenbank (CSV Datei) die ich einmalig anlege. In Spalte a stehen dann die DNS Namen und in Spalte b,c,d immer die Ports. Das Programm soll dann alle diese DNS Namen auf Ihre Erreichbarkeit hin prüfen (aber auf Portebene) Außerdem soll er auch immer nur die Ports prüfen die hinter dem DNS Namen stehen. Wenn also ein DNS Name (spalte a) nur die Spalte b mit dem Port 22 gefüllt hat und die anderen Spalten c und d leer sind, dann soll auch nur der eine Port geprüft werden.

Nachdem das Programm dann einen DNS Namen geprüft hat soll es dazu einen Status schreiben. Aktiv oder nicht erreichbar. Die Ausgabe soll dann in eine andere Excel Datei erfolgen. Also eine Datei zum auswerten. Oder etwas ähnliches was zur Übersicht dient und prompt anzeigt welche DNS + Ports nicht erreichbar sind.

Und bitte nicht böse sein. aber ich verstehe viele für euch anscheinend offensichtlichen Hinweise nicht. Bin voll-Noob
0

Anzeige



#17 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 28. Oktober 2014 - 20:13

Mh, Netzwerk "Voll-Noob"tauglich zu erklären wird schwierig. <_<

Okay, die Portsache hatte ich tatsächlich vergessen. Da hilft test-connection nicht viel weiter.

In Batch müßte man die vier Spalten mit for /f einsammeln - das geht aber nicht so ohne weiteres (for /f mag keine leeren Zellen), da muß man also basteln und das führt glaub ich grad zu weit.

Daher denk ich wäre es wohl am einfachsten, den oben von mir verlinkten Ansatz weiterzuverfolgen, nur halt zusätzlich zu Test-Connection noch mit Start-Process. (*)

Hierzu müßtest Du Dich noch im Netz umzuschauen, ob Du nicht ein Tool findet, welches konkret auf "offenen Port X" prüfen kann und, soweit möglich, auch etwas zurückgibt.
Klar kann man Telnet auch nehmen. Dann muß man aber schauen, wie man das sinnvoll hinkriegt; denn die Verbindung wird vom Server wegen Inaktivität so oder so nach einer von ihm(!) bestimmten Zeit eh beendet. Einfach alles starten und dann schauen, was noch aktiv ist, wird daher unzuverlässig. Kann man machen - es besteht dann aber die Möglichkeit, daß aktive Sockets als inaktiv ausgewiesen werden, weil keine Verbindung mehr besteht.

Innerhalb der Schleife selber bräuchte man mehr oder weniger "nur" einen Einzeiler in dreifacher Ausfertigung:

if ($_.PORT) {Start-Process -FilePath XXXX -ArgumentList $_.SERVERNAME,$_.PORT}



was einfach prüft, ob PORT gesetzt war oder nicht und falls ja, diesen Wert zusammen mit dem SERVERNAMEn an den jeweiligen Prozeß übergibt (eventuell andere erforderliche Parameter nicht vergessen und dran denken, daß -ArgumentList eine kommagetrennte Liste von Argumenten für den Prozeß erwartet). Ein Start-Sleep zu Beginn oder Ende des Schleifenkörpers verzögert das Ganze ggf. noch ein bißchen, um das System zu schonen.

PORT und SERVERNAME sind die bei Import-Csv über den -Header Parameter gebundenen Spaltennamen - die "dreifache Ausfertigung" stammt einfach daher, daß ja pro Server auf drei Ports getestet werden soll und für das bissel lohnt eine innere Schleife nicht. Allerdings bräuchtest Du noch die eine oder andere zusätzliche Spalte im $csv - Objekt, um darin eintragsbezogenen Statusinformationen festzuhalten (zumindest PID, ExitCode). Klar kriegt man die später auch noch raus, das wird dann aber unzuverlässig (siehe weiter oben).

Am Ende müßtest Du dann die ExitCodes der einzelnen Prozesse anschauen: wenn einer vorhanden ist, ist der Prozeß bereits ausgestiegen und wenn nicht, halt nicht. Hier wäre es dann natürlich von unglaublichem Vorteil, wenn das fragliche "Test-Tool" entsprechend differenzierte ExitCodes zurückgibt, damit Du weißt, WAS da genau passiert ist.

Ansonsten müßtest Du halt, so Du die PID in $csv.PID und den ExitCode in $csv.ProcessExit festgehalten hast:

 $csv | Foreach-Object {
# Prozeß ggf. beenden
if (-Not $_.ProcessExit)
   { Stop-Process -Id $_.PID}
# ExitCodes auswerten
switch ($_.ProcessExit)
  {
    0 {...}
    1 {...}
    EXITCODE_n {...}
  }
}



Für den Fall, daß der fragliche Prozessname eindeutig genug ist, kannst Du ach mit Stop-Process -name PROZESSNAME *alle* noch existierenden Prozesse dieses Namens auf einmal erschlagen. Außerdem mußt Du natürlich schauen, wie sich das Stop-Process auf den jeweiligen ExitCode auswirkt; 0 wie "alles okay" wird er dann sicherlich nicht mehr sein. Für bestehende Prozesse müßtest Du also einfach *annehmen*, daß die Verbindung funktioniert hat, und entsprechend behandeln.


Unter anderem deswegen wäre es, wie gesagt, von Vorteil, wenn Du ein "echtes" oder zumindest passenderes Port-Test-Tool als telnet findest. Insbesondere, wenn es die Verbindung nicht aufrecht erhält, sondern stattdessen nur versucht, eine aufzubauen, um dann bei Erfolg "okay" und bei Nichterfolg "is nich" zurückzugeben. Dann sparst Du Dir die Stop-Proess -erei und sonstiges nachträgliches Auswerten; nur der ExitCode des Tools müßte (durch switch() gefiltert) mit ins $csv Objekt gesteckt werden.



(*)
Wenn Du jeden Server nochmal mit Test-Connection -Count 1 abprüfst, sparst Du Dir bis zu zwei Verbindungen pro Rechner, wenn dieser Rechner insgesamt offline war.

Dieser Beitrag wurde von RalphS bearbeitet: 28. Oktober 2014 - 20:20

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#18 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 29. Oktober 2014 - 18:18

So, ich habs mir gerade nochmal durch den Kopf gehen lassen.
Habe da etwas nicht unbedingt elegantes, dennoch funktionierendes auf die Schnelle zusammen gebastelt.

Vorab, was du benötigst:
Windows Form
zwei Buttons
Backgroundworker

Code der Imports (diese werden ganz oben im Code deklariert):
Imports System
Imports System.IO



Code für die Form selbst:
    Public IPAddress As String
    Public Port1 As String
    Public Port2 As String
    Public Port3 As String
    Public line1 As String
    Public line2 As String
    Public line3 As String
    Public path As String = "C:\test.csv"



Code Button 1 (Start der ganzen Sache):
        If BackgroundWorker1.IsBusy = False Then

            BackgroundWorker1.RunWorkerAsync()

        End If

        While BackgroundWorker1.IsBusy = True
            Application.DoEvents()
        End While

        MsgBox("Fertig !!!", MsgBoxStyle.Information)




Code Backgroundworker:

        Dim myWriter1 As New StreamWriter("C:\ausgabe.csv", False)
        myWriter1.WriteLine("IP-Adresse;Port 1;Port 2; Port 3;")
        myWriter1.Close()

        For Each q In File.ReadAllLines(path).Skip(1)

            Dim feld As String() = q.Split(";"c)

            IPAddress = feld(0)
            Port1 = feld(1)
            Port2 = feld(2)
            Port3 = feld(3)


            Try

                Dim tryToConnect As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient(IPAddress, Port1)

                line1 = IPAddress + ";" + Port1 + ":  Open"

            Catch ex As Exception

                line1 = IPAddress + ";" + Port1 + ":  Closed;"

            End Try


            Try

                Dim tryToConnect As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient(IPAddress, Port2)

                line2 = Port2 + ":  Open;"

            Catch ex As Exception

                line2 = Port2 + ":  Closed;"

            End Try


            If feld(3).Length > 0 Then

                Try

                    Dim tryToConnect As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient(IPAddress, Port3)


                    line3 = Port3 + ":  Open;"

                Catch ex As Exception

                    line3 = Port3 + ":  Closed;"

                End Try

            End If

            Dim myWriter2 As New StreamWriter("C:\ausgabe.csv", True)
            myWriter2.WriteLine(line1 + line2 + line3)
            myWriter2.Close()

        Next




Code für Button 2 (zum Schließen der Form):
        Me.Close()



Im Anhang habe ich dieses Programm mal kompiliert, allerdings nur unter Win8.1 getestet. ^^
Das Programm benötigt Dot.Net v4 Client Profile und eine unter C:\ gespeicherte test.csv mit ";" (ohne Leerzeichen) als Trenner.
Das Programm ignoriert die erste Zeile in der csv... hier werden, denke ich mal, die Spaltennamen gesetzt sein. ^^
Die Ausgabe erfolgt als ausgabe.csv unterhalb von C:\

Angehängte Datei  Port-Scanner.zip (123,88K)
Anzahl der Downloads: 62

Dieser Beitrag wurde von Decay bearbeitet: 29. Oktober 2014 - 18:28

0

#19 Mitglied ist offline   Domo991 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 09. Oktober 14
  • Reputation: 0

geschrieben 03. November 2014 - 12:25

DANKE !!!!!!!!!!!!!!!!!!
0

#20 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. November 2014 - 22:01

Axo, wenn du den Code übernimmst, kannst du die Pfade für Einlesen und Ausgabe selbst definieren.

Sofern du Sie irgendwo speziell haben möchtest verweise ich mal auf folgende Klasse:
Environment.GetFolderPath(Environment.SpecialFolder.)


Hier noch eine Übersicht über die Special-Folder Enumeration:
Environment.SpecialFolder-Enumeration

Dieser Beitrag wurde von Decay bearbeitet: 04. November 2014 - 22:02

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0