Text aus einer text datei auslesen und als popup ausgeben

  • Moin Comunity!


    Ich habe ein Problem wo ich einfach feststecke und zwar:


    Ich hab ein Script geschrieben, dass in einer textdatei schreibt ob eine USB festplatte angeschlossen ist oder nicht. ( Festplatte ist aktiv, Festplatte ist inaktiv)

    Jetzt möchte ich dass der Text ausgelesen wird und am besten auf einem anderen pc bildschirm als popup ausgegeben wird wenn der text: Festplatte ist inaktiv in der Textdatei steht.


    geht das relativ einfach oder ist das mit viel schwierigkeiten verbunden?

    kann auch erstmal auf dem lokalen PC als Popup ausgegeben werden :)


    Vielen dank schonmal für eure hilfe :) ^^

  • Hi,

    [autoit]


    $text = FileRead ("c:\usbhd.txt")
    ;Name oder IP
    $computer = "meinpc"
    If StringInStr ($text, "Festplatte ist inaktiv") Then
    ;lokale Meldung
    MsgBox (0,"USB Platte", "Festplatte ist inaktiv")
    ;falls Nachrichtendienst aktiv auf $computer
    Run (@ComSpec & " /c net send " & $computer & " " & @ComputerName & ": Festplatte ist inaktiv!", "", @SW_HIDE)
    EndIf

    [/autoit]

    ;-))
    Stefan

  • [autoit]


    If FileReadLine(@ScriptDir & "\Status.txt", 1) == "Festplatte ist inaktiv" Then
    Msgbox(0,"Status", "Festplatte ist inaktiv")
    EndIf

    [/autoit]


    \Edit: Leider zu langsam... das von ojo ist wohl eh besser, da er die komplette Textdatei durchsucht und ich nur eine Zeile.

    greetz Blade

    Weil Denken die schwerste Arbeit ist, die es gibt, beschäftigen sich auch nur wenige damit.

  • ehm und wie mach ich dass der nur guckt ob in der letzten zeile Festplatte ist inaktiv ausliest?

    weil das eine logdatei ist und der schreibt das immer eine neue zeile.

  • mist das geht nicht weil, wenn sich in der datei die letzte zeile verändert, dann liest er die zeile nicht neu aus sondern gibt immer wieder die meldung: "festplatte ist inaktiv" auch wenn in der letzten zeile was anderes steht.

    mhhh

    [autoit]

    ;Name oder IP
    $computer = "meinpc"
    $text = FileReadLine (@ScriptDir & "\DriveConLog.log", -1)
    While 1

    If StringInStr ($text, "inaktiv") Then
    ;lokale Meldung
    MsgBox (0,"USB Platte", "Festplatte ist inaktiv")
    ;falls Nachrichtendienst aktiv auf $computer
    ;Run (@ComSpec & " /c net send " & $computer & " " & @ComputerName & ": Festplatte ist inaktiv!", "", @SW_HIDE)

    Sleep(3000)

    EndIf
    WEnd

    [/autoit]
  • Probier mal diese Funktion: Wenn sich die Zeilenanzahl nicht erhöht hat, gibt diese Funktion einen leeren String aus "".
    Wenn sich die Zeilenanzahl erhöht hat, dann gibt sie die letze Zeile aus :*

    Spoiler anzeigen
    [autoit]

    Func _FileReadLastLine($sFile)
    Local Static $iLast
    Local $aSplit = StringSplit(FileRead($sFile), @CRLF, 3), $iUB = UBound($aSplit)
    If IsArray($aSplit) Then
    If $iLast = $iUB Then Return ""
    $iLast = $iUB
    Return $aSplit[$iUB - 1]
    EndIf
    EndFunc ;==>_FileReadLastLine

    [/autoit]

    * so ist die Theroie, hab die Funktion ehrlich gesagt noch nicht getestet :D

  • dann musst du die Abfrage in die Schleife einbauen, damit er die Datei immer wieder einliest

    Spoiler anzeigen
    [autoit]


    ;Name oder IP
    $computer = "meinpc"
    While 1
    $text = FileReadLine (@ScriptDir & "\DriveConLog.log", -1)
    If StringInStr ($text, "inaktiv") Then
    ;lokale Meldung
    MsgBox (0,"USB Platte", "Festplatte ist inaktiv")
    ;falls Nachrichtendienst aktiv auf $computer
    ;Run (@ComSpec & " /c net send " & $computer & " " & @ComputerName & ": Festplatte ist inaktiv!", "",SW_HIDE)
    Sleep(3000)
    EndIf
    WEnd

    [/autoit]

    greetz Blade

    Weil Denken die schwerste Arbeit ist, die es gibt, beschäftigen sich auch nur wenige damit.

  • dann kann aber mein anderes Script diese log datei nicht mehr beschreiben und speichern..

  • so hier (hab noch n bisschen mehr umgebaut, ich hoffe, das ist verständlich)

    Spoiler anzeigen
    [autoit]

    $computer = "meinpc"

    [/autoit] [autoit][/autoit] [autoit]

    While 1 * Sleep(1000)
    $text = _FileReadLastLine(@ScriptDir & "\DriveConLog.log")
    Select
    Case StringInStr($text, "inaktiv")
    MsgBox(0, "USB Platte", "Festplatte ist inaktiv")
    Case StringInStr($text, "ist aktiv")
    MsgBox(0, "USB Platte", "Festplatte ist aktiv")
    Case $text = ""
    ToolTip("Keine änderung", Default, Default, "USB Platte")
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _FileReadLastLine($sFile)
    Local Static $iLast
    Local $aSplit = StringSplit(FileRead($sFile), @CRLF, 3), $iUB = UBound($aSplit)
    If IsArray($aSplit) Then
    If $iLast = $iUB Then Return ""
    $iLast = $iUB
    Return $aSplit[$iUB - 1]
    EndIf
    EndFunc ;==>_FileReadLastLine

    [/autoit]
  • man merkt, dass du "Erleuchteter" bist^^,


    ich merke, ich muss noch eine menge lernen...

    Also dein Script welches du gepostet hast funktioniert total gut. aber es wird wohl etwas zeit beanspruchen, damit ich durch die funktionen Select, Case und StringSplit verstehen werde...=(

    mist^^


    Aber vielen vielen dank für deine mühe! ich werde mich bemühen dein Script zu verstehen! =)

  • Na dann fang ich mal mit erklären an :P

    Select/Case/EndSelect ist nur eine übersichtlichere (und schnellere) Variante zu If / ElseIf / EndIf. Man hätte auch schreiben können

    Spoiler anzeigen
    [autoit]

    $text = _FileReadLastLine(@ScriptDir & "\DriveConLog.log")
    If StringInStr($text, "inaktiv") Then
    MsgBox(0, "USB Platte", "Festplatte ist inaktiv")
    ElseIf StringInStr($text, "ist aktiv")
    MsgBox(0, "USB Platte", "Festplatte ist aktiv")
    ElseIf $text = ""
    ToolTip("Keine änderung", Default, Default, "USB Platte")
    EndIf

    [/autoit]

    Das StringSplit(FileRead(...)...) macht nichts anderes, als die Textdatei einzulesen (FileRead) und an den Zeilenumbrüchen (@CRLF) zu trennen (StringSplit). Das ist das gleiche wie die Funktion

    [autoit]

    _FileReadToArray()

    [/autoit]

    , da man das aber auch so in eine Zeile schreiben kann, fand ich es unnötig extra dafür noch eine Datei zu includen.

    Meine Funktion mach folgendes:
    Datei in ein Array einlesen (stringSplit(Fileread(...)...)), und mithilfe von Ubound() die Größe herausfinden. Da für jeden Zeile ein eigenes Arrayelement erstellt wird, ist die Größe des Arrays gleich der Zeilen in der Datei - soweit klar?

    Die Variable $iLast speichert die letzte Zeilenanzahl. Wenn die Größe des Arrays größer ist, als der Wert in $iLast, dann sind Zeilen dazugekommen. Die Funktion gibt jetzt einfach die letzte Zeile Zurück (Return $aSplit[$iUB-1]), nachdem der Wert in $iLast auf die neue Zeilenanzahl "aktualisiert" wurde.

    • Offizieller Beitrag

    Ich hab ein Script geschrieben, dass in einer textdatei schreibt ob eine USB festplatte angeschlossen ist oder nicht. ( Festplatte ist aktiv, Festplatte ist inaktiv)
    Jetzt möchte ich dass der Text ausgelesen wird und am besten auf einem anderen pc bildschirm als popup ausgegeben wird wenn der text: Festplatte ist inaktiv in der Textdatei steht.

    Also mich wundert etwas, wie Du das Ganze angehst. Du hast ein Script, das prüft, ob eine USB-Festplatte angeschlossen ist oder nicht und das schreibt diesen Status in eine Logdatei.
    Wozu brauchst Du jetzt noch ein zweites Script, was diese Logdatei ständig wieder auslesen muss, um zu prüfen, ob die Platte angeschlossen ist oder nicht?
    Warum erledigt das nicht ein einziges Script?

  • Also mich wundert etwas, wie Du das Ganze angehst. Du hast ein Script, das prüft, ob eine USB-Festplatte angeschlossen ist oder nicht und das schreibt diesen Status in eine Logdatei.
    Wozu brauchst Du jetzt noch ein zweites Script, was diese Logdatei ständig wieder auslesen muss, um zu prüfen, ob die Platte angeschlossen ist oder nicht?
    Warum erledigt das nicht ein einziges Script?


    Ja das könnte man machen, aber ich mach das lieber seperat, damit ich mir das andere script nicht wieder kaputt mache.


    ich hatte eigentlich vor per vpn verbindung das ganze an Nagios zu schicken, aber net send würde erstmal reichen.


    ich muss jetzt erstmal off für heute, morgen lern ich weiter :) danke euch allen!

  • hier das script^^


    ich habe vor, wenn die festplatte für längere zeit nicht aktiv ist, dass das script eine Email an mich schickt... aber ich weiss nicht wie^^

    nen Exchange hab ich auch am laufen, also das wäre nicht das problem.

    weisste vielleicht mir zu helfen?^^


    [autoit]

    ;Dieses Script prüft ob die USB Festplatte angeschlossen ist oder nicht.
    ;wenn die Festplatte nicht mehr angeschlossen ist wird das Script per LAN USB Utility die Festplatte wieder verbinden und danach Freigeben.
    ;In der DriveConLog.txt logdatei wird alles geloggt.
    Opt("TrayAutoPause", 0)
    Global $AllDrives
    Global $Drive
    Global $DriveActive=0
    Global $_LogText
    Global $_LogFile



    While 1
    $AllDrives=DriveGetDrive("REMOVABLE")
    If IsArray($AllDrives)=1 Then
    $Drive=$AllDrives[1]
    _Log("Programm wurde gestartet.")
    Angeschlossen()
    EndIf
    Sleep(1000)
    WEnd

    Func Angeschlossen()
    Sleep(10000)
    While DriveStatus("F:")="READY" Or DriveStatus("E:")="READY"
    If $DriveActive=0 Then
    _Log("Festplatte ist aktiv.")
    $DriveActive=1
    EndIf
    Sleep(10000)
    WEnd
    $DriveActive=0
    _Log("Festplatte ist inaktiv.")
    Abgeschlossen()
    EndFunc

    Func Abgeschlossen()
    Sleep(200)
    WinGetHandle("LAN USB Utility")
    If @error Then
    _Log("LAN USB Utility.exe wird neu gestartet, weil das Programm abgestuerzt ist.")
    ProcessClose("LAN USB Utility.exe")
    Sleep(1000)
    Run("C:\Programme\Sharkoon\LAN USB Utility\LAN USB Utility.exe")
    EndIf
    ControlClick("LAN USB Utility", "", "[CLASSNN:Button1]")
    Sleep(1000)
    ControlClick("LAN USB Utility", "", 1002, "left", 1, 52, 28)
    Sleep(100)
    ControlClick("LAN USB Utility", "", "[CLASSNN:Button2]")
    Sleep(60000)
    _Log("Festplatte wird verbunden...")
    Freigeben()
    EndFunc

    Func Freigeben()
    If DriveStatus("F:")="READY" Then
    _Log("Festplatte F: wird als Name:Backup freigegeben...")
    _RunDos("net share Backup=F:")
    _Log("Festplatte ist Freigegeben.")
    ElseIf DriveStatus("E:")="READY" Then
    _RunDOS("net share Backup=E:")
    _Log("Festplatte E: wird als Name:Backup freigegeben...")
    _Log("Festplatte ist Freigegeben.")
    EndIf
    Sleep(1000)

    Angeschlossen()

    EndFunc
    Func _RunDOS($sCommand)
    Local $nResult = RunWait(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)
    Return SetError(@error, @extended, $nResult)
    EndFunc
    Func _Log($_LogText)
    $_LogFile=FileOpen(@DesktopDir&"\DriveConLog.log", 1)
    FileWrite(@DesktopDir&"\DriveConLog.log",@CRLF&@MDAY&"."&@MON&"."&@YEAR&" - "&@HOUR&":"&@MIN&":"&@SEC&" "&$_LogText)
    FileClose($_LogFile)
    EndFunc

    [/autoit]
  • wenn ich die ip von meinem exchange da eintrage funktioniert es nicht...

    er gibt immer den error code 50.


    mhh was mache ich falsch?

  • Hi,

    die Hilfe zu den jeweiligen Funktionen bekommst Du mit F1 oder Start->Programme->AutoIt->AutoIt Help File -> Index -> _InetSMTPMail

    Hilfe _InetSMTPMail:
    5x - Cannot open SMTP session. x indicates the index number of last command issued to the SMTP server

    Überprüfe mal die config von Deinem Exchange Server. Eventuell hat der gar keinen SMTP am laufen oder lässt nur bestimmte IP Adressen für SMTP zu.

    Ansonsten ist mit der Aussage, Ip eingetragen, funktioniert nicht wenig anzufangen.

    ;-))
    Stefan

    @Edit zum testen vom SMTP Port:
    Start -> ausführen -> cmd -> OK. Im Dos Fenster: telnet <IP-Adresse Exchange> 25
    Schwarzes Fenster -> Port 25 (SMTP) kann geöffnet werden
    Ansonsten Fehler