Hallo
Ganz herzlichen Dank für die tolle Unterstützung und Ratschläge von euch allen!
In der Zwischenzeit habe ich "meinen" Skript fertig und es funzt (hat aber bestimmt noch Luft nach oben was die Qualität anbelangt)!
Gruss Thork
Hallo
Ganz herzlichen Dank für die tolle Unterstützung und Ratschläge von euch allen!
In der Zwischenzeit habe ich "meinen" Skript fertig und es funzt (hat aber bestimmt noch Luft nach oben was die Qualität anbelangt)!
Gruss Thork
Morgen allerseits,
Besten Dank fuer die Tipps, muss erst mal verstehen was eure Vorschläge machen.
Eine Frage hätte ich schon, ich lese ja den string in eine Variable ($ABCinfo) ein, in euren Beispielen deklariert ihr den Wert aber statisch (der String im json File kann dauernd ändern, nur das Format bleibt beständig).
Wie auch immer, muss mich mit trial und error herantasten.
Gruss thork
Hallo
Ich habe eine Funktion geschrieben welche mittels FileRead eine Variable mit Text abgefüllt >>> {"version":"0.170.14.7","oldVersion":"0.170.13.804"}
In einem zweiten Schritt versuche ich nun den Wert welcher zwischen dem 3. und 4. Anführungszeichen steht "0.170.14.7" wiederum in eine Variable zu schreiben, aber hier scheitere ich!
Mein Versuch mit StringMid funktioniert, aber das Resultat ist nur solange korrekt, wie sich die Versionierung (Anzahl Char) nicht ändert.
Kann mir jemand Hilfestellung leisten und sagen wie ich das, resp. mit welchem Befehl sowas gemacht werden kann ich lese im Tutorial nach aber verstehe es nicht?
Gibt es etwas das sich wie awk, sed oder dergl. anfühlt?
Besten Dank für Unterstützung
Gruss Thork
Func _Read_info()
$ABCinfo = FileRead("C:\Program Files (x86)\ABC\install.json")
;MsgBox (0, "JASON File", "Ergebnis ist: " & $ABCinfo)
$ABCinfo2 = StringMid($ABCinfo, 12, 12)
;MsgBox(0, "12 chars extracted from position 11 are:", $ABCinfo2)
EndFunc ;==>_Read__info
Hallo
Ich habe einen Script welcher aus der Registry einen numerischen Wert ausliest der sich nach erfolgtem Login der Applikation ändert (was bis zu 2-5 Minuten dauern kann.
$Variable1 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\XYZ\\XYZ Info", "ID ")
Gerne möchte ich eine Schleife bilden die den numerischen Wert solange vergleicht bis dieser eine Änderung erfahren hat, dann die Schleife verlassen und mit dem script fortfahren.
Ich habe einige Beispiele gesehen welche einen Zähler 1 -n verwenden, ist aber für mich nicht praktikabel da ich nicht genau weiss wie lange es dauert bis der RegKey resp. die Variable1 eine Änderung erfährt.
Wie muss ich es anstellen das der Loop solange läuft bis die Variable1 ändert?
Für Hilfestellung besten Dank
Thorkfumble
Hallo community
Ich bin derzeit daran ein best. autoit Program anzupassen, dabei muss ich den sftp.exe Aufruf durch WinScp.com ersetzen.
mittels WinScp.com kann ich folgendes erfolgreich umsetzen
C:\Program Files (x86)\path\winscp\winscp.com /privatekey="C:\Program Files (x86)\path\winscp\ftp_ppk.ppk" user@host:/data_in /script="c:\Program Files (x86)\path\winscp\scp_script.txt"
wenn ich diesen Code aber versuche in Autoit zu integrieren, kriege ich nichts gebacken.
Run('"C:\Program Files (x86)\path\winscp\winscp.com"/privatkey="C:\Program Files (x86)\path\winscp\ftp_ppk_mm.ppk" "user@host:/data_in" /script="c:\Program Files (x86)\path\winscp\scp_script.txt"'
Hat jemand Rat was ich falsch mache?
Gruss thork
Hallo
Ich drehe mich wieder mal im Kreis.
Versuche eine Funktion zu erstellene die ein File öffnet, die erste Zeile liest und das ganze in eine Variable abfüllt.
Soweit so gut, der Output den ich erhalte ist erwartungsgemäss die ganze Zeile.
13:50:39:352 [main] INFO - Starting APP| Version: 1.2.3.44| 17625654| 15.02.2018 07:37:55
Aber eigentlich interresiert mich nicht die ganze Zeile sondern nur die rot markierten Werte.
Unter UNIX würde ich das ganze mit awk -F " " '{print $7,$9,$10) auslesen, mit Autoit kriege ich das nicht hin.
Kann mir jemand einen Tipp geben wie ein awk ähnlicher Befehl eingebaut werden kann?
Besten Dank für Hilfe
Thorkfumble
Func _ReadSIXid_Version()
$f = FileOpen("C:\Program Files (x86)\Appl\log\error.log",0)
if $f = -1 Then
MsgBox("Error", "No File available: ", $f)
Else
if $f = 1 Then
$line = FileReadLine ($f,1)
$str = StringLeft($line,69)
MsgBox(0, "The Version loaded is: ", $str)
FileClose ($f)
Exit
EndIf
Endif
EndFunc
Besten Dank Alpines
Ich habe Deinen Tipp umgesetzt und teste mal über einen längeren Zeitpunkt ob das beobachtete Verhalten eliminiert wird.
Danke und Gruss
Thork
Hallo
Ich habe nachfolgendes Problem wo ich nicht weiterkomme und irgendwie an Ort trete.
Das Skript welches mir ein Problem verursacht macht im wesentlichen folgendes:
1. Funktion: Start eines Programmes Prog.exe
2. Funktion: Sammeln von Informationen um diese in einem info_file.txt File bereitzustellen
3 Funktion: Mittels sFtp das info_file.txt an einen entfernten Server übermitteln.
In seltenen Fällen tritt das Problem auf, dass ich offensichtlich den Fokus von sFtp verliere und den String Always
(angedacht damit die sFtp Verbindung beim erstmaligen Anmelden das Login im known_host Files von sFtp schreibt - no, once, Always)
nicht in die DOX Box mit dem laufenden sFtp sende, sondern in die Login Maske welche durch Funktion 1 ebenfalls gestartet ist.
Wie gesagt trifft dies selten zu und ist m.E. timing abhängig (resourcen/performance).
Ich habe daraufhin das Skript angepasst (rote Zeile) in der Meinung das ich den Focus auf dass, in der Dos Box laufende, sFTp.exe Programm lege > leider ohne Erfolg.
Es kommt immer noch vor das der String "Always" an das aktive Login Fenster gesendet wird.
Hat vielleicht jemand einen guten Rat oder weiss was ich falsch mache?
Gruss thork
Func _Send_Info_File()
if FileExists ($sftp_exe) then
Run ("sftp -i " & $key & " " & $info_file & " uid@tr_fis:/data_in")
If WinWaitActive("C:\Program Files (x86)\Attachmate\Reflection\sftp.exe", "", 5) Then
WinActivate("C:\Program Files (x86)\Attachmate\Reflection\sftp.exe")
Send("Always{Enter}")
EndIf
else
endif
EndFunc
Hallo Autoiter & Kanashius
Besten Dank für die Zeit die ihr meinem Problem resp. mir Unwissenden zu Teil kommen habt lassen.
Letztendlich haben mir der Code und die dazugehörenden Instruktionen von autoiter sehr geholfen, einerseits das Problem zu lösen,
anderseits zu verstehen wie autoit funzt.
Besten Dank und Gruss an euch beide
Thork
Hallo Autoiter
Besten Dank, habe endlich Zeit gefunden mir deinen Lösungsvorschlag durch den Kopf gehen zu lassen und erhalte nun eine saubere Auflistung aller Eintrage des xml Files !
Der Ansatz mit Array erscheint mir sehr effiezient, weitaus effizienter als jedes Attribut aus dem Text rauszufriemeln.
Zu guter letzt stelle ich mir aber die Frage, dass - wie Eingangs beschrieben - ich den aus der Registry ausgelesenen Wert (zBsp. $MM_LastPopUsed = ID_5) diesen im Array
wieder finde und mir die Attributewerte aus Col1 und Col2 anzeigen resp. in neuen Variablen abfüllen lassen kann .
Käme da _ArrayFindAll in Frage, was ich versucht aber nicht verstanden habe,
oder kann das mit einem IF $MM_LastPopUsed EXIST; THEN ...... Statment in deine Funktion integriert werden?
Fragen über Fragen..............mir raucht der Schädel
Gruss thork
Hallo
Besten Dank für die Vorschläge, leider - so denke ich mal - sind diese beiden nicht wirklich umsetzbar oder ich versteh den Lösungsansatz nicht.
Meine Ausgangslage ist ja, dass ich aus der Registry die ID_nn kenne und diese als Variable im script deklariert habe
Global $MM_LastPopUsed = ID_nn
Das settings.xml File wird diese ID_nn irgendwo beinhalten,ich benötige dann nur noch die Werte der beiden folgenden Tags <Host Port und <Host IP um diese weiterverarbeiten zu können.
Was ich sagen kann ist, dass das xml File ID_nn sowie die beiden Tags Host Port und Host IP immer vorkommen.
<Pop id="Id_1" name="ServerMain" source="User">
< Hosts port="4444">
< Host ip="Servermain"/>
@autoiterdu gehst davon aus das es einen TAG <Pop> gibt was nicht der Fall ist,
es beginnt mit <Pops> gefolgt von <Pop name> oder <Pop id> und schliesst mit </Pop> </Pops> .
Ebenso deklarierst du eine Variable $sString mit dem Inhalt des xml files, ohne dass das File eingelesen wird.
Mir scheint diese Sache ziemlich kompliziert daher verfolge ich alternativ einen zweiten Ansatz,weiss aber auch nicht wie dies in autoit umsetzbar wäre.
Unter Unix würde ich netstat mit awk ausführen und dies einer Variablen zuordnen, etwa so:
netstat -an | grep 4555
TCP 10.156.1.34:50965 192.168.90.78:4555 ESTABLISHED
netstat -an | grep 4555 |awk -F" " '{print $3}'
192.168.90.78:4555
oder etwas verfeinert
netstat -an | grep 4555 |awk -F" " '{print $3}'|awk -F: '{print $1, $2}'
192.168.90.78 4555
Ich bekäme so alternativ zum Hostname die IP gelistet,was mir ausreichen würde.
Nur will das auch nicht richtig klappen, untenstehende autoit Funktion gibt als Ergebniss die PID von cmd.exe aus.
func _Get_Netstat_Port()
Local $sData = Run('cmd /k netstat -an |find /n /i "4555"', '', @SW_SHOW)
;Local $sData = Run(@ComSpec & " /c " & 'netstat -an'|findstr 555' , @SW_HIDE)
MsgBox (0, "titel", "text" & $sData)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $strDefaultPop = ' & $sData & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
EndFunc
Was mache ich falsch?
Vielen Dank für weitere Hilfe
thork
Hallo
Leider muss ich mich als weitestgehend unerfahren hinsichtlich Programmierung outen und benötige Hilfe.
Vor lauter Bäume sehe ich den Wald nicht mehr
Ich verstehe nicht wie ich meiner Funktion beibringen kann im setting.xml File nach dem Wert der Variable zu suchen, anschliessend den Wert von
Host Port und im dritten Schritt den Wert Host IP auszulesen resp. in Variablen abzufüllen.
Global $MM_LastPopUsed = RegRead("HKEY_CURRENT_USER\Software\Vendor\Prod\Platform", "LastPopIdUsed") --> hat bspw. Wert = ID_1 (kann aber auch ID_2 / ID_3 etc. sein)
letztendlich benötige ich zwei abgefüllte Variablen mit den Werten des Ports und der Host IP (also 4444 und Servermain als Beispiel)
Auszug aus dem setting.xml File
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Configuration>
<AppSettings>
<DefaultPop pop_id="Id_3"/>
<Pops>
<Pop name="ServerA" id="Id_3" source="User">
<Hosts port="4555">
<Host ip="servera"/>
</Hosts>
</Pop>
<Pop name="ServerB" id="Id_2" source="User">
<Hosts port="5555">
<Host ip="Server"/>
</Hosts>
</Pop>
<Pop id="Id_1" name="ServerMain" source="User">
<Hosts port="4444">
<Host ip="Servermain"/>
...............
................................
Meine Versuche der Funktion sind bisher kläglich gescheitert, ich verstehs einfach noch nicht und die Hilfe verwirrt mich noch mehr
func _File_Read_XML_PORT-Host()
Local $line = FileRead($file)
if StringInStr ( $line, “$MM_LastPopUsed ") > 0 Then
$posStart=StringInStr ( $line, $sPoPIst) + 11
$posEnd=StringInStr ( $line, " id" , 0, 1) -1
$sPoPIst=StringMid ( $line, $posStart , $posEnd - $posStart )
MsgBox(0, "Pop Ist", "Name ist" & $sPoPIst )
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $strDefaultPop = ' & $sPoPIst & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
EndIf
Ich bin mir durchaus bewusst das ich nicht erwarten kann eine Schlüsselfertige Lösung präsentiert zu erhalten, es würde mich aber sehr freuen
wenn ich den einen oder anderen Tipp erhalten würde, welcher mir erklären würde wie ich das lösen kann.
Besten Dank und Gruss
Thork