Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Ping und Net Use



  • Please log in to reply
12 replies to this topic
CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Hallo liebe Mitstreiter,

 

ich habe ein Batchscript das ich gerne in ahk "übersetzen" möchte.
 

Ping Test-PC|find "Antwort" 1>Nul 2>NUL
if %ERRORLEVEL%==0 (echo Ping OK && net use Z: \\Test-PC\Daten-D /persistent:no) ELSE (echo kein Ping)


So scheint es zu funktionieren...
 

RunWait, C:\Windows\System32\ping.exe Test-PC ,, Hide UseErrorLevel
If ErrorLevel = 0
{
Run %comspec% /c net use z: \\Test-PC\Daten-D /persistent:no, , hide
}
else
exitApp

Gibt es eine Möglichkeit auch das ahk Symbol beim Start des Scriptes auszublenden?



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

#NoTrayIcon


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Vielen Dank, das war er entscheidende Tipp...

Mein Script sieht jetzt so aus, die Dateipfade und Computerbezeichnungen sind zu vernachlässigen ;-) 
 

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
RunWait, %comspec% /c ping -n 1 Fantec ,, Hide UseErrorLevel
If ErrorLevel = 0
{
Run %comspec% /c net use w: \\Fantec\D /persistent:no, , hide
}
else
exitApp

Gibt es weitere Verbesserungsmöglichkeiten?



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011
✓  Best Answer

ne, ich find's hübsch. Wenn es denn tut, was es soll ^^

 

Die geschweiften Klammern können weg, da in dem Fall nur eine Zeile hinter If und Else auszuführen ist.

Else ist aber sowieso über, weil das Script nach dem Run-Befehl nichts mehr macht.

ExitApp ist ebenfalls über, weil das Script nicht persistent ist und zunächst mal nur durch das RunWait am Leben erhalten wird.

 

Also würde das so auch ausreichen:

#NoTrayIcon
RunWait, %comspec% /c ping -n 1 Fantec ,, Hide UseErrorLevel
If ErrorLevel = 0
   Run %comspec% /c net use w: \\Fantec\D /persistent:no, , hide

Oder eben mit Audio-Feedback, weil ich es persönlich mag, wenn ich an den Sounds erkennen kann, was da so passiert:

#NoTrayIcon
RunWait, %comspec% /c ping -n 1 Fantec ,, Hide UseErrorLevel
If (ErrorLevel = 0) {
   Run %comspec% /c net use w: \\Fantec\D /persistent:no, , hide
   SoundPlay, *32
} Else
   SoundPlay, *16

All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Danke Seidenweber für Dein Feedback und die Blumen (...ne, ich find's hübsch. Wenn es denn tut, was es soll ^^)

Ja es tut was es soll. Nämlich temporär Netzwerklaufwerke verbinden, die dann beim herunterfahren wieder getrennt werden.
Da die Laufwerke auch nicht immer vorhanden sind, z.B. Laptop, Medialaufwerk, etc., soll halt ein Abfrage per Ping erfolgen.
Und das funktioniert auch zuverlässig.

Vielen Dank für Deine Überarbeitung, ich bin allerdings kein Soundfan, daher würde ich dann doch Deine obere Version nutzen wollen.
 



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Und hier noch mal meine fertige Version (es wird kein störendes Command Popup und kein Tray Symbol angezeigt.
Außerdem wird vorab geprüft ob die Verbindung bereits hergestellt wurde. Vielleicht kann es Jemand von Euch auch gebrauchen ;-)
 

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
If (FileExist("Z:\")) ; Hier kann auch ein Pfad zu einer Datei angegeben werden, z.B.: Z:\testdatei.txt
exitApp ; eine Verbindung des Laufwerkes ist nicht notwendig, also beende das Script
else ; andernfalls verbinde das Laufwerk
{
RunWait, %comspec% /c ping -n 1 Asus-PC ,, Hide UseErrorLevel ;  die Konsole (cmd) wird versteckt (, "Arbeitsverzeichniss", Hide) gestartet und es wird per Ping geprueft - ob Asus-PC existiert
If ErrorLevel = 0 ; wurde der PC / das Laufwerk erfolgreich gefunden = 0 - Also kein Fehler
Run %comspec% /c net use Z: \\Asus-PC\Daten-D /persistent:no , , hide ; fuehre die Konsole (cmd) versteckt (, "Arbeitsverzeichniss", Hide) aus und verbinde per Net Use mit Asus-PC als Laufwerk Z
}

Da es perfekt funktioniert, gehe ich davon aus das es fehlerfrei ist, allerdings lasse ich mich auch gern berichtigen ;-)
Ich habe es in Windows 7 im Aufgabenplaner und lasse es alle 5 Minuten starten, sicherlich könnte man auch eine Schleife einbauen, aber das übersteigt meine Kenntnisse.

Aber über den Aufgabenplaner funktioniert ja auch Alles.



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Danke.

Immer schön, wenn dann auch der fertige und funktionierende Code nachzulesen ist. Die Meisen begnügen sich leider damit, wenn sie selber eine Antwort haben happy.png

 

Zur Schleife:

 

Der Code, der in bestimmten Intervallen ausgeführt werden soll, kommt in ein Label.

z.B.

Connect:
  ; hier dein Code
Return

Am Anfang des Scriptes wird ein Timer gesetzt. Die Angabe der Zeit erfolgt in Millisekunden

Settimer, Connect, 300000 ; = 5 Minuten

Bis der Timer mit

Settimer, Connect, Off

ausgeschaltet oder das Script beendet wird, wird das Label dann alle 5 Minuten angesprungen.

 

ExitApp wird durch Return - also Rücksprung aus dem Label - ersetzt, damit in 5 Minuten der nächste Versuch erfolgt.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Vielen Dank für Deine vielen Tipps, ich werde das bei Gelegenheit nochmals aufgreifen.

Ja, ich bin auch der Meinung das man die fertigen Ergebnisse ruhig mal posten sollte, schließlich können die Ergebnisse auch dem ein oder anderen Interessierten helfen.
Sozusagen auch als Dankeschön für die erhaltene Hilfestellung.



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

So ich habe das Ganze jetzt nochmal universeller gestaltet.  ;-)

 

Da ich aber so meine Problemchen habe zu erkennen, wann die literale Schreibweise von Nöten ist, sind Tests sehr willkommen.
Bei mir funktioniert es perfekt...

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
#Persistent ; Keeps a script permanently running - fuer den Timer notwendig


; ##################################################
; Hier kommen die Variablen...
Pfad_001 := "W:\" ; Hier kann auch ein Pfad zu einer Datei angegeben werden, z.B.: Z:\testdatei.txt
PC_Name_IP_001 := "Fantec" ; Der Name des PCs, des Medialaufwerkes, etc. oder die IP-Adresse
LW_Buchstabe_001 := "W:" ; Mit welchem Laufwerksbuchstaben soll das Netzlaufwerk in das System eingebunden werden, vordere Laufwerksbuchstaben sind allgemein schon vergeben (C=Windows, D=Festplatte oder CD, etc)
Verbinde_mit_001 := "\\Fantec\D" ; \\"Computername" ODER \"IP-Adresse" \"Laufwerksname" ODER \"Ordnername" also, zum Beispiel, in dieser Form: \\Computername\Ordnername
; ##################################################


Settimer, PC_Verbindung, 300000 ; erstelle einen Timer, und wiederhole ihn alle 5 Minuten (in Millisekunden)  ---  es handelt sich um ein Label (Sub-Programm) das mit Return geschlossen wird
PC_Verbindung: ; was soll der Timer genau machen:  ---  es handelt sich um ein Label (Sub-Programm) das mit Return geschlossen wird

If (FileExist("%Pfad_001%"))
{
Settimer, PC_Verbindung, Off ; beende den Timer da das Laufwerk gefunden wurde
exitApp ; eine Verbindung des Laufwerkes ist nicht notwendig, also beende das Script
}

else ; andernfalls verbinde das Laufwerk
{
RunWait, %comspec% /c ping -n 1 %PC_Name_IP_001% ,, Hide UseErrorLevel ;  die Konsole (cmd) wird versteckt (, "Arbeitsverzeichniss" , Hide) gestartet und es wird per Ping geprueft - ob das Laufwerk existiert
If ErrorLevel = 0 ; wurde der PC / das Laufwerk erfolgreich gefunden = 0 - Also kein Fehler
Run %comspec% /c net use %LW_Buchstabe_001% %Verbinde_mit_001% /persistent:no , , hide ; fuehre die Konsole (cmd) versteckt (, "Arbeitsverzeichniss", Hide) aus und verbinde per Net Use mit den entsprechenden Parametern
}
Sleep, 10000 ; Gib Net Use 10 Sekunden Zeit zur Ausfuehrung
Return ; Enter springt zum Timerbeginn


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

 

Da ich aber so meine Problemchen habe zu erkennen, wann die literale Schreibweise von Nöten ist, sind Tests sehr willkommen.

 

Und mit dem Problem bist du nicht alleine.

 

Bis auf damals wenige eingebaute Funktionen hatte Chris bei praktisch allen Befehlen literale Schreibweise vorgesehen.

 

Wenn du etwas siehst wie "Befehl, Parameter, Parameter", ist 'Parameter' in literaler Form gefordert. Wenn du eine Variable benutzt, dann also in %%.

 

Es gibt auch die Form "Befehl, Variable, Parameter". Dann meint 'Variable' den NAMEN der Variablen (nicht den Inhalt) - also nicht in %%

 

Inzwischen sind an den meisten Stellen neben der literalen Schreibweise auch Ausdrücke erlaubt, die dann mit EINEM % eingeleitet werden.

 

Innerhalb von Ausdrücken wird dann alles in "" als literal betrachtet, der Rest als Variable oder Funktion()

 

Du entscheidest das also selber und kannst entweder

Run, %Pfad%\Programm.exe ; literale Schreibweise

oder

Run, % Pfad "\Programm.exe" ; Expression-Schreibweise

benutzen.

 

Dasselbe bei Zuordnungen. Da schafft die Verwendung von = oder := Verwirrung.

MyVar = Grafikkarte

Test = Ich will eine neue %MyVar%
Test := "Ich will eine neue " MyVar

Test = % "Ich will eine neue" A_Space MyVar
Test := "Ich will eine neue" A_Space MyVar

Test = % "Ich will eine neue" . A_Space . MyVar
Test := "Ich will eine neue" . A_Space . MyVar

Das ist alles (noch) gültig.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Danke für Deine ausführliche Erklärung zum Thema literale Schreibweise...

Wäre es auch möglich wenn 2 Netzlaufwerke verbunden werden sollen, das Script so lange auszuführen, bis beide Laufwerke verbunden sind?
Wie könnte das realisiert werden?

Meine Versuche waren leider nicht erfolgreich:
Pfad_002 enthält eine nicht existierende Datei, trotzdem die ERFOLGS MsgBox...

If FileExist ("%Pfad_001%") AND ("%Pfad_002%")
MsgBox, Das hat geklappt %Pfad_001% und %Pfad_002% wurden gefunden!!!
else
MsgBox, Das hat NICHT geklappt!!!!

Funktioniert auch nicht, die ERFOLG MsgBox wird immer angezeigt...

If FileExist ("%Pfad_001%") AND If FileExist ("%Pfad_002%")
MsgBox, Das hat geklappt!`n`n%Pfad_001%`nund`n%Pfad_002%`n`nwurden gefunden!!!

else
MsgBox, Das hat NICHT geklappt!!!!

auch hier immer wieder ERFOLG

If FileExist ("Pfad_001") AND ("Pfad_002")
MsgBox, Das hat geklappt!`n`n%Pfad_001%`nund`n%Pfad_002%`n`nwurden gefunden!!!

Wo liegt der Fehler???



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

FileExist() ist eine Funktion und die Klammern gehören zum Namen.

 

Die Funktion gibt einen String zurück (was als True gesehen wird, weil der Rückgabewert nicht NULL ist), wenn die Datei existiert. Oder ist leer, wenn sie nicht existiert (was als False gesehen wird).

 

 

 

Die in AHK eingebauten Funktionen geben immer einen Wert zurück (was nicht zwangsläufig bei jeder Funktion, die man selber schreibt, der Fall sein muss)

 

Um die Funktion und die richtige Schreibweise zu testen, kannst du

MsgBox % Funktion()

benutzen.

MsgBox % FileExist ("%Pfad_001%")

wird %Pfad_001% anzeigen, weil FileExist ohne Klammern eine leere Variable ist, die nichts mit der Funktion FileExist() zu tun hat UND die Klammern um  "%Pfad_001%" nichts weiter bewirken UND letztlich nur der innerhalb der Anführungszeichen literal interpretierte Teil gesehen wird.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Ich danke Dir für die Erklärung. Dann muss ich das anders lösen.