Script vereinfachen (Arrays)

  • Hallo und ein gutes neues Jahr 2008
    (wenns auch ein wenig spät sein sollte)

    Könnte man das Script etwas kleiner oder besser gesagt mit weniger Befehlen erstellen?
    Will sagen, die Platzhalter gleich ich die Arrays schreiben?
    Wobei ich dann nicht weiß, wie ich die dann einzeln ansprechen kann?

    Dann bin ich mir nicht sicher, ob ich am Schluß vor den If`s nicht 2x den Befehl : for $Element ... angeben müßte,
    oder ob er das so auch nacheinander ausführt?

    Danke schon mal!

    Fintan

    Spoiler anzeigen
    [autoit]


    $rpfile=@ScriptDir & "\notepad.exe"
    $ServPf=@WindowsDir & "\servicepackfiles\i386\notepad.exe"
    $wsi=@WindowsDir & "\source\WinXP\i386\notepad.exe"
    $dlCaN=@SystemDir & "\dllcache\notepad.exe"
    $SysNp=@SystemDir & "\notepad.exe"
    $Wnpx=@WindowsDir & "\notepad.exe"
    $npx="notepad.exe"

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

    ;backup Microsoft Notepad.exe
    $WinBU=DirCreate(@WindowsDir & "\Notepad-backup")
    If FileExists($Wnpx) Then FileCopy($Wnpx, $WinBU, 1)

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

    $HmDr1=@HomeDrive & "\i386\notepad.exe"
    If FileExists($HmDr1) Then FileCopy($HmDr1, $WinBU, 1)

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

    $HmDr2=@HomeDrive & "\i386\NOTEPAD.EX_"
    If FileExists($HmDr2) Then FileCopy($HmDr2, @WindowsDir & "\Notepad-backup\NOTEPAD.EX_", 1)

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

    ;temporary disables protection for notepad.exe
    Dim $Array[7]

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

    $Array[0] = $ServPf
    $Array[1] = $dlCaN
    $Array[2] = $SysNp
    $Array[3] = $Wnpx
    $Array[4] = $HmDr1
    $Array[5] = $HmDr2
    $Array[6] = $wsi

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

    For $Element In $Array
    If FileExists($Element) Then DllCall(@SystemDir & "\SFC_OS.DLL","dword", 5, "dword", 0, "wstr", $Element, "dword", -1)
    Next
    If FileExists($Element) Then FileCopy($rpfile, $Element, 1)
    Exit

    [/autoit]

    PS: Hey klasse, dass der Autoit Code jetzt farbig dargestellt wird.

    Einmal editiert, zuletzt von Fintan (14. Januar 2008 um 19:19)

    • Offizieller Beitrag

    Hallo

    So ungefähr:?

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    ;Dim vom Array ( $Array[x] = [123,"blabla",0xff00,....]
    Dim $Files[7] = [@WindowsDir & "\servicepackfiles\i386\notepad.exe",@WindowsDir & "\source\WinXP\i386\notepad.exe", @SystemDir & "\dllcache\notepad.exe",@SystemDir & "\notepad.exe",@WindowsDir & "\notepad.exe",@HomeDrive & "\i386\notepad.exe",@HomeDrive & "\i386\NOTEPAD.EX_"]
    _ArrayDisplay($Files)
    $rpfile=@ScriptDir&"\notepad.exe"
    $npx="notepad.exe"

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

    ;backup Microsoft Notepad.exe
    $WinBU=DirCreate(@WindowsDir & "\Notepad-backup")
    If FileExists($Files[4]) Then FileCopy($Files[4], $WinBU, 1)

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

    If FileExists($Files[5]) Then FileCopy($Files[5], $WinBU, 1)
    If FileExists($Files[6]) Then FileCopy($Files[6], $WinBU, 1)
    ;temporary disables protection for notepad.exe

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

    For $Element In $Files
    If FileExists($Element) Then DllCall(@SystemDir & "\SFC_OS.DLL","dword", 5, "dword", 0, "wstr", $Element, "dword", -1)
    Next
    If FileExists($Element) Then FileCopy($rpfile, $Element, 1)
    Exit

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

    ;Was auch geht:
    #cs
    For $i = 0 To UBound($Files) - 1
    If FileExists($Files[$i]) Then DllCall(@SystemDir & "\SFC_OS.DLL","dword", 5, "dword", 0, "wstr", $Files[$i], "dword", -1)
    Next
    #ce

    [/autoit]

    Mfg Spider

  • Heißt die Funktion 5 ?? oder fehlt der Funktionsname
    DllCall(@SystemDir & "\SFC_OS.DLL","dword", 5, "dword", 0, "wstr", $Element, "dword", -1)

  • Hallo
    GtaSpider
    Vielen Dank, das sieht gut aus, ich als Leihe würde sagen, einfacher geht es nicht mehr. :thumbup:

    @progandy
    Hm, bin ich überfragt, evtl. soll das ja auch die Anzahl sein? :huh:
    Jetzt muss ich gestehen, dass ich das Script von German-nLite abkopiert habe! :rolleyes:
    Aber keinen Schimmer, ob es so richtig ist oder nicht! :whistling:


    Der Übersicht halber könnte man das auch so auflisten?
    Und sind die File - Nummern so richtig, wie ich sie dahinter geschrieben habe?
    Oder habe ich da was falsch verstanden? ?(

    Spoiler anzeigen
    [autoit]

    Dim $Files[7] = [@WindowsDir & "\servicepackfiles\i386\notepad.exe", _
    @WindowsDir & "\source\WinXP\i386\notepad.exe", _
    @SystemDir & "\dllcache\notepad.exe", _
    @SystemDir & "\notepad.exe", _ ; $Files[4]
    @WindowsDir & "\notepad.exe", _ ;$Files[5]
    @HomeDrive & "\i386\notepad.exe", _ ;($Files[6]
    @HomeDrive & "\i386\NOTEPAD.EX_"]

    [/autoit]

    Edi T sagt:
    In der Hilfe steht: DllCall ( "dll", "return type", "function" [, "type1", param1 [, "type n", param n]] )
    function ->The name, eg. "MessageBox" or the ordinal value, e.g. 62, of the function in the DLL to call.
    Dann nehme ich mal an, dass das der Value (5) ist, der in der SFC_OS.DLL damit angesprochen wird!
    Also müßte das so passen, oder?

    2 Mal editiert, zuletzt von Fintan (14. Januar 2008 um 17:33)

  • Ja das ist richtig. Das ruft die 5. Methode auf, wodurch die Datei für 1min entsperrt wird.
    Wenn der Link nicht OK, ist, bitte löschen :) Es ist Punkt

    Zitat

    3 Hack Method 3: Disable WFP on a specific file for 1 minute via undocumented SFC API

  • Du bist´n Held, jetzt weiß man wenigstens, was dahintersteckt, alles Klar :thumbup: !

    Wenn noch jemand was zu meinen Fragen oben sagen kann, macht ihr mich glücklich. :)

    Vielen dank, schon mal.

    Fintan

  • Also Arrays sind 0-basiert...
    Damit sind deine Nummern 1 zu groß
    Die Auflistung sollte gehen :)