Umwandlung vbs-Code in AutoIt & Stringbearbeitung

  • Hallo,

    das Einlesen von Arrays ist für mich neu, darum nicht ganz einfach.
    Hier benötige ich noch etwas Unterstützung.

    Folgende vbs-Datei lese ich ein:
    ' Create a Scheduled Task
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
    errJobCreated = objNewJob.Create _
    ("Notepad.exe", "********013000.000000-420", _
    True , 16 , , , JobID)
    If Err.Number = 0 Then
    Wscript.Echo "neuer Task wurde erstellt : " & JobID
    Else
    Wscript.Echo "Fehler, kein Task geplant: " & errJobCreated
    End If

    Was möchte ich tun?
    1.) Auslesen des Arrays in Spalte "notepad.exe", Suchen der Zahl "0130" und ersetzen gegen den Inhalt von $zeit1 (Aarray[7])
    2.) Auslesen des Arrays in Spalte "True, 16...." und Ersatz der Zahl 16 gegen $tag (Aarray[8])
    3.) Einspielen der veränderten String in den Array an gleiche Steller
    4.) Erzeugen einer neuen vbs-Datei mit _FileWriteFromArray

    Und hier mein bisheriges Script:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Dim $ziel1 = "C:\BKU\ToDo"
    Dim $aArray
    Dim $zeit1 = Random(9,13,1) & ":" & StringRight("0" & Random(00,59,1),2) &":" & StringRight("0" & Random(00,59,1),2);Startzeit des Tasks
    Dim $tag = Random(1,5,1) ; *** Zufallsgenerator ***
    Dim $wtag ; *** Festlegung der Tage für das vbs-Script, welches eine Task planen soll ***
    Dim $wochentag

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

    #comments-start
    So sieht die einzulesende vbs-Datei aus:

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

    ' Create a Scheduled Task
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
    errJobCreated = objNewJob.Create _
    ("Notepad.exe", "********013000.000000-420", _
    True , 16 , , , JobID)
    If Err.Number = 0 Then
    Wscript.Echo "neuer Task wurde erstellt : " & JobID
    Else
    Wscript.Echo "Fehler, kein Task geplant: " & errJobCreated
    End If

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

    Was möchte ich machen:
    1.) Auslesen des Arryas in Spalte "notepad.exe", Suchen der Zahl "0130" und ersetzen gegen den Inhalt von $zeit1 (Aarray[7])
    2.) Auslesen des Arryas in Spalte "True, 16...." und Ersatz der Zahl 16 gegen $tag (Aarray[8])
    3.) Einspielen der veränderten String in den Array an gleicher Steller
    4.) Erzeugen einer neuen vbs-Datei mit _FileWriteFromArray

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

    #comments-end

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

    ; *** Definition der Variablen zur Verteilung der Netzwerklast auf verschiedene Tage ***
    ; *** Festlegung der Wochentage für das vbs-Script
    Select
    Case $Tag = 1
    $WTag = "1" ; *** Für die spätere Übergabe an das Array --> vbs-Datei
    $Wochentag = "Montag" ;*** für die spätere Meldung per "msgbox" zur Information des Users
    Case $Tag = 2
    $WTag = "2"
    $Wochentag = "Dienstag"
    Case $Tag = 3
    $WTag = "4"
    $Wochentag = "Mittwoch"
    Case $Tag = 4
    $WTag = "8"
    $Wochentag = "Donnerstag"
    Case $Tag = 5
    $WTag = "16"
    $Wochentag = "Freitag"
    EndSelect

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

    ; *** Einlesen der ganzen Datei ein ein Array
    _FileReadToArray ($ziel1&"\scheduled.vbs",$aArray )

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

    ; *** Hier schauen wir zum testen, wie die einzelnen Arrays aussehen
    For $x = 1 to $aArray[0]
    Msgbox(0,'Record:' & $x, $aArray[$x])
    Next

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

    Einmal editiert, zuletzt von puni4 (19. Januar 2008 um 22:24)

  • Ist 'n Ansatz, jedoch nur speziell für dein aktuelles 'shedule.vbs'!
    Du möchtest aber sicherlich dass das Script generell mit VBScripts dieser Art klar kommt, oder ?

    Spoiler anzeigen
    [autoit]

    $sPathVBS = 'C:\example.vbs'
    $fhNewVBS = FileOpen('C:\new.vbs', 2)
    Dim $arTextVBS

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

    If Not _FileReadToArray($sPathVBS, $arTextVBS) Then
    MsgBox(4112, 'Error', 'Datei konnte nicht eingelesen werden!', 5)
    Else
    For $i = 1 To $arTextVBS[0]
    Select
    Case StringInStr($arTextVBS[$i], 'Notepad.exe')
    StringReplace($arTextVBS[$i], '0130', $zeit1, 1)
    Case StringInStr($arTextVBS[$i], 'True , 16')
    StringReplace($arTextVBS[$i], '16', $tag, 1)
    EndSelect
    Next
    _FileWriteFromArray($fhNewVBS, $arTextVBS)
    EndIf

    [/autoit]

    Gruß
    Greenhorn


  • So einen scheduled Task kannst du auf XP auch mit SCHTASKS.exe erstellen:

    Spoiler anzeigen


    Oder mit dem Objekt gleich in AutoIT:

    Spoiler anzeigen
    [autoit]

    ;' Create a Scheduled Task
    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialize a COM error handler

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

    $strComputer = "."
    $objWMIService = ObjGet("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
    If Not IsObj($objWMIService) Then MsgBox(0, '', "Kein Task geplant. Objekt konnte nicht erstellt werden.")
    $objNewJob = $objWMIService.Get("Win32_ScheduledJob")
    If @error Then MsgBox(0, '', @error)
    Global $JobID
    $errJobCreated = $objNewJob.Create("Notepad.exe", "********013000.000000-420", True , 16 , "", 0, $JobID)
    If Not @error Then
    MsgBox(0, '', "neuer Task wurde erstellt : " & $JobID)
    Else
    MsgBox(0, '', "Fehler, kein Task geplant: " & @error & " _ " & $errJobCreated)
    EndIf

    ; This is my custom defined error handler
    Func MyErrFunc()
    #cs
    Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
    "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
    )
    #ce
    Local $err = $oMyError.number
    If $err = 0 Then $err = -1
    SetError($err) ; to check for after this function returns
    Endfunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (19. Januar 2008 um 19:57)

  • Danke euch zwei für die Vorschläge.

    Zum Vorschlag "SCHTASKS.exe"
    Meine Versuche scheiterten dahin, das der Task entwender
    a) unter dem Administratoraccount
    b) unter dem Systemaccount
    laufen sollte.
    Bei a) gibt es das Problem, das das Admin-Passwort Sonderzeichen beinhaltet, die der Taskplaner weder in der Commandline, noch im Asisstent so nicht akzeptiert.

    So blieb nur Variante b) übrig.
    Die Methode über eine vbs-Datei war dabei eben bisher die Zuverlässigste und Einfachste.

    Die Möglichkeit, vbs-Objekte in AutoIT direkt anzusprechen, hatte ich schon lange gesucht.
    Somit kann ich das "_FileReadToArray" und die Stringbearbeitung sparen.

    Sobald ich mein Script vervollständigt habe, werde ich es hier posten.... :D

    Edit:
    noch ein Problem beim Einfügen einer Variablen.
    Was mache ich hier falsch?

    So habe ich es bisher geschafft:

    [autoit]

    $errJobCreated = $objNewJob.Create("Notepad.exe", "********013000.000000-420", True , $wtag, "", 0, $JobID)

    [/autoit]

    Und so soll es aussehen:

    [autoit]

    $errJobCreated = $objNewJob.Create("Notepad.exe", "********"&$zeit1&"00.000000-420", True , $wtag, "", 0, $JobID)

    [/autoit]

    Einmal editiert, zuletzt von puni4 (19. Januar 2008 um 21:11)

  • So, :D
    hier nun das fertige Script.
    Ich habe versucht, es soweit wie möglich auszukommentieren.

    Hintergrund:
    Ein Programm soll mit Systemrechten zum Update verschiedener Dateien und Programme gestartet werden.
    Um die Systemlast auf das Netzwerk beim Update so gering wie möglich zu halten, soll der Task bei jedem User
    an unterschiedlichen Tagen und Zeiten starten.

    Durch die Verwendung von Variablen im Script ist es jedem möglich, das Script leicht auf seine eigenen Bedürfnisse anzupassen.

    Hinweis:
    Der Task kann nicht mehr manuell verändert werden, wenn er im Taskplaner erscheint.

    Script:

    Spoiler anzeigen
    [autoit]

    ; *****************************************
    ; *** created by puni4 ***
    ; *** mit Unterstützung durch ***
    ; *** progandy & Greenhorn ***
    ; *** und http://www.AutoIt.Dec ***
    ; *** Date: 2008-01-19
    ;******************************************

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

    #cs
    Diese vbs-Datei sollte mit AutoIT verarbeitet werden:

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

    ' Create a Scheduled Task
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
    errJobCreated = objNewJob.Create _
    ("Notepad.exe", "********013000.000000-420", _
    True , 16 , , , JobID)
    If Err.Number = 0 Then
    Wscript.Echo "neuer Task wurde erstellt : " & JobID
    Else
    Wscript.Echo "Fehler, kein Task geplant: " & errJobCreated
    End If

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

    Was sollte gemacht werden:
    1.) Umwandlung der vbs-Datei in AutoIT-Code zum Ansteuern des Taskplaner mit Systemberechtigung
    1.) Suchen der Zahl "130" und ersetzen gegen den Inhalt von Variable $zeit1, die vorher mit einem Zufallsgenerator erzeugt wurde
    2.) Ersatz der Zahl 16 gegen Variable $tag
    4.) Starten des Taskplaner
    #ce

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

    #include <File.au3>
    #include <Array.au3>

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

    ; *** Verzeichis mit dem Programm für den Taskplaner ***
    Dim $quelle = "C:\BKU\ToDo\Update.exe"

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

    ; *** Definition der Variablen zur Verteilung der Netzwerklast auf verschiedene Zeiten ***
    ; *** Festlegung der Zeiten für das vbs-Script ***
    Dim $zeit1 = Random(1,6,1) & StringRight("0" & Random(00,59,1),2);*** Startzeit des Tasks- beachten: CEZ-Zeit (US) ***
    Dim $zeit2, $zeit3, $zeit4
    Dim $tag = Random(1,5,1) ; *** Zufallsgenerator ***
    Dim $wtag ; *** Festlegung der Tage für das vbs-Script, welches eine Task planen soll ***

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

    ; *** Definition der übrigen Variablen ***
    Dim $wochentag, $oMyError, $strComputer, $objWMIService, $objWMIService, $objNewJob, $JobID, $errJobCreated, $string1, $string2

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

    ; *** Definition der Variablen zur Verteilung der Netzwerklast auf verschiedene Tage ***
    ; *** Festlegung der Wochentage für das vbs-Script ***
    Select
    Case $Tag = 1
    $WTag = "1" ; *** Für die spätere Übergabe an das Array --> vbs-Datei ***
    $Wochentag = "Montag" ;*** für die spätere Meldung per "msgbox" zur Information des Users ***
    Case $Tag = 2
    $WTag = "2"
    $Wochentag = "Dienstag"
    Case $Tag = 3
    $WTag = "4"
    $Wochentag = "Mittwoch"
    Case $Tag = 4
    $WTag = "8"
    $Wochentag = "Donnerstag"
    Case $Tag = 5
    $WTag = "16"
    $Wochentag = "Freitag"
    EndSelect

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

    ; *** Ersetzen des Strings gegen den Wert aus dem Zufallsgenerator ***
    $zeit2 = "********013000.000000-420"
    $zeit3 = StringReplace($zeit2, "130", $zeit1, 1)

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

    ; *** Umrechnen der Startzeit in MEZ-Zeit ***
    $zeit4 = $zeit1 + 800

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

    ; *** Stringauswahl für die Angabe der Zeiten für die Msgbox ***
    $string1 = StringLeft($zeit4,2)
    $string2 = StringRight($zeit4,2)

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

    ; *** Task planen mit Hilfe von Com-vbs-Objekten ***
    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialize a COM error handler
    $strComputer = "." ; *** variabler Comptername möglich ***
    $objWMIService = ObjGet("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
    If Not IsObj($objWMIService) Then MsgBox(0, '', "Kein Task geplant. Objekt konnte nicht erstellt werden.")
    $objNewJob = $objWMIService.Get("Win32_ScheduledJob")
    If @error Then MsgBox(0, '', @error)
    Global $JobID
    $errJobCreated = $objNewJob.Create($quelle, $zeit3, True , $wtag, "", 0, $JobID)

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

    ; *** Fehlerbehandlung und Erfolgsmeldung ***
    If Not @error Then
    MsgBox(0, '', "Ein neuer Task wurde erstellt und wird zukünftig jeden "&$wochentag &" um "&$string1&":"&$string2&" Uhr gestartet")
    Else
    MsgBox(0, '', "Fehler, Es konnte kein Task geplant werden: " & @error & " _ " & $errJobCreated)
    EndIf

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

    ; *** Fehlerbehandlung COM Error ***
    Func MyErrFunc()
    #cs
    Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
    "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
    )
    #ce
    Local $err = $oMyError.number
    If $err = 0 Then $err = -1
    SetError($err) ; to check for after this function returns
    Endfunc

    [/autoit]