Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : (BATCH) - startscript



Uranjitsu
11.07.2016, 18:25
Hallo zusammen,

kennt sich jemand mit Batch-Dateien aus?
Ich bräuchte ein kleines Startscript, mit folgenden Features:

- Starten von zwei *.exe Dateien in zwei unterschiedlichen Ordner
- Zeit + Datum des System auf den aktuellen Stand setzen
- Zwei Fenster anordnen (Rechts oben / Rechts unten am Bildschirmrand)
- Die LID-Funktion bei Laptops (Energieoptionen) von Sleep auf Do nothing stellen

Zu beachten sind das Datum der jeweiligen Ordner, hier muss sicher mit RegEx gearbeitet werden, damit man die Batch hinterher nicht nach einem Update der Tools anpassen muss.

Grundstruktur:
https://www.szenebox.org/images/_imported/2016/07/67.jpg
In den Ordner WTP*
https://www.szenebox.org/images/_imported/2016/07/68.jpg
Ordner 1: WindowsActive*
Datei starten: WindowsActive.exe (Hat nie eine Versionsnummer)
Ordner 2: asus-wtp\bin
Datei starten: DiagEG.exe

Dann sollen die Fenster, wie oben beschrieben, angeordnet werden.
Name der Fenster:
Fenster 1: System Reperation Tool 3.14 (Die Version variiert auch, demnach denke ich, muss ich auch rein RegEx genutzt werden)
Fenster 2: WindowsActive

Dann sollte das Datum + Zeit des Systems aktualisiert werden.
Berücksichtigt werden sollte für die Batch, dass es sich hier ab Windows 7 - Windows 10 Systeme handelt

Und die Funktion der Laptops/Netbooks/etc., welche das Gerät zum einschlafen bringt, wenn das Display geschlossen wird, soll ausgestellt werden.

Hat davon jemand Ahnung? Ist mein Wunsch möglich und würde das jemand für mich umsetzen?
Das würde den Arbeitsprozess wirklich verkürzen und ich wäre mehr als nur dankbar.

LG - Uranjitsu

banane
11.07.2016, 22:54
Ich denke mal das ich dir als Batch unwissender da nicht weiterhelfen kann.
Trotzdem fallen mir zwei Dinge auf. Wobei ich gar nicht weiß ob ich da richtig liege.
Erstens, ich bin mir nicht sicher ob es das überhaupt noch gibt, aber ich glaube Batch Dateien kann man sowohl im einfachen CMD Fenster laufen lassen, als auch als Powershell Batch. Vielleicht sollte man abklären was es davon sein soll/darf.
Das zweite,
System Reperation Tool 3.14 (Die Version variiert auch, demnach denke ich, muss ich auch rein RegEx genutzt werden)


Das kommt wohl darauf an wo du die jeweils aktuelle Version angibst. Irgendjemand oder etwas muss diese ja ändern und aktuell halten, wird die irgendwo angegeben oder steht das in einer immer erneuerten Datei ?
Man könnte die sicher auch ganz am Anfang der Batch in eine Variable übernehmem, das wäre per Hand sicher immer schnell geändert. Steht diese Versionsnummer dagegen in irgendeinen Dateinamen, gäbe es sicher auch Möglichkeiten sie da raus zu übernehmen.
Wie auch immer, ich denke das das keine großen Wünsche von dir sind die sich relativ leicht umsetzten lassen. Nur wegen dem Stromsparmodi bin ich nicht sicher, das kenne ich nicht. Würde aber darauf tippen das da eher ein Wert in der Registry geändert werden muss, insofern wird dich sicher jemand finden der das flott umsetzten kann.

Uranjitsu
12.07.2016, 18:39
Die Versionen werden von ASUS geändert, wir ziehen immer nur die aktuellen Versionen.
Wann eine neue Version erscheint, entscheidet ASUS.

Daher müssen die Versionsnummer wie o.b. via RegEx genutzt werden bzw. so das es egal ist, welche Nummer dort steht. Wichtig ist dabei zu beachten "Buchstaben+Zahlen+Bindestrich+Unterstrich+." Das sind alle Zeichen die vorkommen können.

Und es soll als Batch-File *.bat genutzt werden.

Ich bekomme es einfach nicht, daher suche ich mir Hilfe hier bei euch und jemanden der kurz dafür mal etwas Zeit aufbringen würde.

LG

1stAid
13.07.2016, 00:13
Daher müssen die Versionsnummer wie o.b. via RegEx genutzt werden bzw. so das es egal ist, welche Nummer dort steht. Wichtig ist dabei zu beachten "Buchstaben+Zahlen+Bindestrich+Unterstrich+." Das sind alle Zeichen die vorkommen können.

für welche ordner genau?
für den WindowsActive ordner würde diese pattern treffen

WindowsActive[\w\.\_]*

Erklärung
nach dem string "WindowsActive"
"[]*" treffe alles was in belibiger Zahl "*" in den "[ ]" Klammern steht.
"\w" kleines w = alles was Buchstabe oder Zahl ist.
"\." realer Punkt.
"\_" realer unterstrich.


System\sReperation\sTool\s\d+\.\d*
"\s" Leerzeichen
"\d+" \d Zahl, "+" mindestens 1 mal bis beliebig.
"\." realer Punkt
"\d*" Null bis beliebig viele Zahlen

Wenn du mehrere Ordner hast die Treffen, dann entweder die Versionsnummern auswerten, oder z.B. das Erstelldatum vergleichen.

Gruß

Cannonau
13.07.2016, 13:37
Hallo,

das sollten wir hinkriegen. :-)


Zur Zeit: ist denn eine Quelle für die aktuelle Zeit verfügbar? Dann sollte das doch automatisch passieren. Wenn man vor nirgendwo die Zeit holen kann, wird's schwierig. Ansonsten sollte ein "W32TM /resync" genügen.
Fensteranordnung: Das geht AFAIK nicht mit Bordmitteln, es gibt aber wohl kleine Zusatztools, die das können und die sich per Batch steuern lassen
LID-Funktion: Da müßte man mehr über die Geräte wissen. Wenn die GUID für dieses Setting auf allen Geräten gleich ist, kann man das über powercfg setzen oder, einfacher noch, auf einem Gerät damit exportieren und dann per Batch auf den anderen importieren
Datum der Ordner: Am besten das Verzeichnis über "dir /O:-D" ausgeben lassen und dann das erste Verzeichnis von oben als das Gesuchte setzen. Regex kannst Du Dir damit ersparen und das ist unter Windows auch gut so ;-)

Uranjitsu
14.07.2016, 21:09
Hallo ihr zwei,

vorweg kurz ein Danke dafür das ihr euch die Zeit nimmt um zu helfen.
Das andere ist, es muss nicht zwingend via *.bat ausgeführt werden, wenn man dafür generell ein kleines Tool schreiben kann, würde das auch helfen.

@1stAid:
Auf dem USB-Stick ist folgende Struktur bzw. soll die Struktur aussehen:
tool./exe/bat/whatever
WTP 07.07.2016 (Datum ändert sich immer wieder nach einem Update, darum auch hier das RegEx um auf den Ordner zuzugreifen)
Der Ordner WTP muss angesteuert werden, dann der Ordner "WindowsActive1.6.7.4_20160519" (Auch hier ändert sich 1.6.7.4_20160519 immer) und die darin enthaltene "WindowsActive.exe" gestartet werden.
Ebenfalls muss der Ordner "asus-wtp\bin" angesteuert werden und die DiagEG.exe gestartet werden.
Beispielstruktur
J:\startscript.ENDUNG
J:\WTP 07.07.2016\WindowsActive1.6.7.4_20160519
J:\WTP 07.07.2016\asus-wtp\bin

Beide Programme sofort starten.

@Cannonou:
- Die Zeit soll das aktuelle Datum des Tages + Uhrzeit sein. Diese wird wohl via Netzwerk bzw. Internet bezogen.
Bisher nutze ich dafür diese time.bat



@echo off
ECHO ZEIT WIRD GESYNCT!
W32TM /CONFIG /SYNCFROMFLAGS:MANUAL /MANUALPEERLIST:"PTBTIME1.PTB.DE PTBTIME2.PTB.DE" /RELIABLE:YES
W32TM /CONFIG /UPDATE
W32TM /RESYNC /FORCE
NET STOP W32TIME
NET START W32TIME

Set /P = Enter druecken zum Beenden


Das soll natürlich das (vllt besser) direkt in das Startscript integriert werden oder gerne auch nur dadurch gestartet werden. Zeit+Datum hat Vorang vor alle anderen Funktionen.
- Wenn das Oneclick-Tools sind und ansteuerbar, wäre das super !!
- Die LID-Funktion, sollte eventuell via Registry aus "do-nithing" gestellt werden können. Es geht hier nur um Windows Systeme ab Windows 7 und aufwährts


Wie gesagt, davon habe ich absolut gar keine Ahnung und muss wirklich die Community dabei um Hilfe/Code/Fertigstellung bitten.
Und es ist wie gesagt egal, in welcher Sprache das Startscript geschrieben ist... via AutoIt, Delphi, Batch, whatever, hauptsache es würde den Zweck erfüllen.

EXTRA DATEI: Außerdem wäre noch eine zusätzliche Funktion zum Vorteil sein via Batch(oder ähnliches) in dem Ordner (C:/Test Report/Reports/*PC-SERIENNUMMER*.pdf oder auch mal *.txt den Name der auslesen und in den Zwischenspeicher laden, so das man direkt die Seriennummer via STRG+V wo einfügen kann.

LG und Danke im Voraus für die Zeit
- Uranjitsu

- - - - - - - - - - Beitrag nachträglich erweitert - - - - - - - - - -

Was ich bisher alleine realisiert habe ist das:


@echo off
SET WPT=07.07.2016
SET WA=1.6.7.4_20160519

ECHO ZEIT WIRD GESYNCT
W32TM /CONFIG /SYNCFROMFLAGS:MANUAL /MANUALPEERLIST:"PTBTIME1.PTB.DE PTBTIME2.PTB.DE" /RELIABLE:YES
W32TM /CONFIG /UPDATE
W32TM /RESYNC /FORCE
NET STOP W32TIME
NET START W32TIME

ECHO TOOLS STARTEN
start "WindowsActive" "WTP %WPT%\WindowsActive%WA%\WindowsActive.exe"
start "SystemTool" "WTP %WPT%\asus-wtp\bin\DiagEG.exe"

ECHO ZEIT WIRD NOCH EINMAL GESYNCT!
W32TM /CONFIG /SYNCFROMFLAGS:MANUAL /MANUALPEERLIST:"PTBTIME1.PTB.DE PTBTIME2.PTB.DE" /RELIABLE:YES
W32TM /CONFIG /UPDATE
W32TM /RESYNC /FORCE
NET STOP W32TIME
NET START W32TIME

Set /P = Enter druecken zum Beenden

Und das ist alles andere als wirklich gut. Die RegEx Angaben kann ich leider nicht verwenden, welche 1stAid vorgegeben hat :/
Fenster verschieben, also positionieren... keine Ahnung

Cannonau
15.07.2016, 00:19
Für die LID-Sache, die Verschiebung und die Seriennummer sollten wir uns mal kurzzschließen, ich schicke Dir eine PN.

Der Rest dürfte hiermit erschlagen sein. Mein Script sucht sich immer die beiden EXEn aus dem neusten Verzeichnis (Erstellungsdatum des Verzeichnisses und Variable _asustag sind ausschlaggebend, Datum im Verzeichnisnamen wird nicht berücksichtigt).

Deinen Timesync-Code habe ich einfach übernommen, ich gehe davon aus, daß er getestet ist und für Deine Umgebung funktioniert.

Die drei Variablen bei Bedarf einfach anpassen ;-)


@echo off
:::::::::::::::::::::::::
:: Init - hier koennen die Variablen nach Bedarf angepasst werden

set _root=%~dp0\
set _asustag=WTP
set _activetag=Active

:::::::::::::::::::::::::
PUSHd %_root%
call :GET_NEWEST_DIR
PUSHd %_newestdir%
call :GET_ACTIVE_DIR
POPd
call :TIMESYNC
POPd
start "WindowsActive" "%cd%\%_newestdir%\%_activedir%\WindowsActive.exe"
start "SystemTool" "%cd%\%_newestdir%\asus-wtp\bin\DiagEG.exe"
GOTO:eof

:GET_ACTIVE_DIR:
for /F "tokens=4 usebackq" %%A in (`dir *%_activetag%* ^| find "%_activetag%"`) do set _activedir=%%A
GOTO:eof

:GET_NEWEST_DIR:
for /F "tokens=4,5 usebackq" %%D in (`dir *%_asustag%* /O:D ^| find "%_asustag%"`) do set _newestdir=%%D %%E
GOTO:eof

:TIMESYNC:
W32TM /CONFIG /SYNCFROMFLAGS:MANUAL /MANUALPEERLIST:"PTBTIME1.PTB.DE PTBTIME2.PTB.DE" /RELIABLE:YES
W32TM /CONFIG /UPDATE
W32TM /RESYNC /FORCE
NET STOP W32TIME
NET START W32TIME
GOTO:eof


Cannonau

Edith sagt: Kleinen Kniff eingebaut, falls der Laufwerksbuchstabe des Sticks sich mal ändert ;-)

Uranjitsu
15.07.2016, 20:56
Grüße Dich,

herzlichen Dank für deine bisherige Hilfe - Saustark !

Jetzt gibt es leider ein Problem.

Ich habe nun auch via Autoit etwas realisieren können(natürlich nur semi).
Das Problem ist, dass DiagEG.exe extern den Aufruf verweigert.
Startet man es direkt vom Stick in der dafür von ASUS erstellten Administrationsoberfläche, ist das kein Problem.
Startet man diese via Autoit oder Batch, wird sie kurz gestartet und beendet.

Jetzt habe ich nun via Autoit das so geschrieben, dass sich für die DiagEG.exe ein Fenster mit einem Button öffnen. Über den Button kann diese dann wie gewohnt gestartet werden. Jetzt wollte ich den Klick auf den Button auch automatisieren um ein möglichst automatischen Start zu gestalten.




#comments-start
ShellExecute('time.bat') ; TIME.BAT STARTEN
Sleep(5000)
ShellExecute('WTP ' & $WTP & '\WindowsActive' & $WA & '\WindowsActive.exe') ; WINDOWS ACTIVE STARTEN
Sleep(5000)
ShellExecute('WTP ' & $WTP & '\asus-wtp\bin\DiagEG.exe') ; DIAGEG.EXE STARTEN
Sleep(5000)
ShellExecute('time.bat') ; TIME.BAT STARTEN
#comments-end

#RequireAdmin
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

ShellExecute('time.bat') ; TIME.BAT STARTEN
Sleep(2000)
WindowsActive()
Sleep(2000)
DiaEG()

Func WindowsActive()
; TOOL VERSIONEN
$WA = "1.6.7.4_20160519" ; WINDOWS ACTIVE VERSION
$SRT = "3.14" ; REPERATION TOOL

Global $titel1 = 'WindowsActive' ; WINDOWS ACTIVE FENSTERNAME
Global $titel2 = 'Systeme Preparation Tool' & $SRT & '' ; SYSTEME REPERATION TOOL FENSTERNAME


; Run WindowsActive with the window maximized.
Run("WTP\WindowsActive" & $WA & "\WindowsActive.exe", "", @SW_SHOWMAXIMIZED)

; Wait 10 seconds for the WindowsActive window to appear.
WinWait("[CLASS:WindowsActive]", "", 10)

; Wait for 2 seconds.
Sleep(2000)

; FINDE DAS FENSTER UND POSITIONIERE
If WinExists($titel1) Then
WinActivate($titel1)
WinWait($titel1)
Local $aPos = WinGetPos($titel1)
WinMove($titel1,"",1,1,$aPos[2],$aPos[3])
EndIf

If Not WinExists($titel1) Then
Beep(500, 1000)
EndIf

EndFunc ;==>WindowsActive
Sleep(2000)
ShellExecute('time.bat') ; TIME.BAT STARTEN

Func DiaEG()
$WA = "1.6.7.4_20160519" ; WINDOWS ACTIVE VERSION

$Form1_1 = GUICreate("DiaEG", 366, 341, 363, 324)
GUISetBkColor(0x434E54)
$Button1 = GUICtrlCreateButton("DiaEG Starten", 0, 48, 139, 49, $WS_GROUP)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Run ( "WTP\asus-wtp\bin\DiagEG.exe", "WTP\asus-wtp\bin\") ; normales spiel für single player und online
Exit
EndSwitch
WEnd
EndFunc ;==>WindowsActive



Ich weis, der Code ist grässlich, aber das war bisher das einzige was funktioniert.

Cannonau
15.07.2016, 21:47
Wie der Code aussieht, ist doch erstmal egal, solange Du ihn noch warten kannst. :-)

Ich kenne mich mit AI nicht aus - aber das ist doch gerade dafür geschrieben worden, Mausklicks zu usw. zu simulieren, oder? Funktioniert das denn wie gewünscht?

Ansonsten, wenn Du weiter den Batch-Weg gehen willst, mal mit WMIC schauen, ob diese EXEn einen bestimmten Aufrufparameter brauchen, einfach nach dem Start über das CLI eingeben:


wmic PROCESS where "commandline like '%iagE%'" get Processid, Caption, Commandline

Die Aufrufe aus der Batch dann entsprechend ergänzen und testen. Oder den Output posten ;-)

Cannonau