Ja, das Errorhandling und ich werden keine Freunde mehr Ich werd das von dir mal ausprobieren. Der -spf Befehl ist in dem 7z bei mir gar nicht gelistet und der packt dann auch "komisch" zusammen
Beiträge von dieselwiesel
-
-
So schauts jetzt aus, funktioniert auch...
Spoiler anzeigen
AutoIt
Alles anzeigen#include <Array.au3> #include <File.au3> #include <MsgBoxConstants.au3> #include <Constants.au3> Local $sFolder = _FileListToArrayRec("c:\myprog", "*1;*2;*3;*4;*5||6", 2, 0, 1, 2) ;Prüfen welche von der vorgegebenen Ordnern überhaupt da sind bzw. der Auszuschließen ist If @error Then MsgBox(0, "", "Keine Ordner gefunden.") Else ;_ArrayDisplay($sFolder) Local $aCount, $sInclude For $i = 1 To UBound($sFolder) - 1 $sFiles = _FileListToArrayRec($sFolder[$i], "*", 1, 1, 1, 2) ; Anzahl der Dateien ermitteln ;_ArrayDisplay($sFiles) If $sFiles[0] > Number("0") Then $aCount += $sFiles[0] ; Anzahl addieren $sInclude &= "-i!" & $sFolder[$i] & " " ; String für SevenZipAdd $aFiles erstellen Next If $aCount > Number("0") Then SevenZipAdd(StringTrimLeft($sInclude, 3), "C:\myprog.7z", $aCount) Else MsgBox(0,"", "Keine Dateien gefunden.") EndIf EndIf Func SevenZipAdd($aFiles, $sArchive, $sCount) Local $iMax = $sCount Local $iPID = Run("7z.exe a -r " & $sArchive & " " & $aFiles, @SystemDir, @SW_SHOW, $STDERR_MERGED) Sleep(50) Local $sConsole, $sLine, $iUB ProgressOn("Progress Meter", "Adding to archive", "0 % (0 / " & $iMax & ")") Do $sConsole &= StdoutRead($iPID) If @error Then ExitLoop $aResult = StringRegExp($sConsole, "(Compressing\h+.*)", 3) $iUB = UBound($aResult) $iPerc = Int($iUB / $iMax * 100) ProgressSet($iPerc, $iPerc & " % (" & UBound($aResult) & " / " & $iMax & ")") Until Not Sleep(10) ProgressOff() EndFunc
Verbesserungsvorschläge are welcome
-
Danke erstmal für Eure Antworten!!!
Ich habe ein Bsp. von UEZ gefunden, dass eigentlich recht gut funktioniert u. auch den Zweck erfüllt
Spoiler anzeigen
AutoIt
Alles anzeigen;coded by UEZ 2013 #include <Constants.au3> Global Const $sPath7Zip = '"c:\Program Files\7-Zip\7z.exe"' Global $sFiles = '"c:\Temp"' Global $sArchive = '"c:\Test.7z"' SevenZipAdd($sFiles, $sArchive) Func SevenZipAdd($sFiles, $sArchive) Local $iMax = GetAmountFF($sFiles) Local $iPID = Run($sPath7Zip & " a " & $sArchive & " -r " & $sFiles, @ScriptDir, @SW_HIDE, $STDERR_MERGED) Sleep(50) Local $sConsole, $sLine, $iUB ProgressOn("Progress Meter", "Adding to archive", "0 % (0 / " & $iMax & ")") Do $sConsole &= StdoutRead($iPID) If @error Then ExitLoop $aResult = StringRegExp($sConsole, "(Compressing\h+.*)", 3) $iUB = UBound($aResult) $iPerc = Int($iUB / $iMax * 100) ProgressSet($iPerc, $iPerc & " % (" & UBound($aResult) & " / " & $iMax & ")") Until Not Sleep(10) ProgressOff() EndFunc Func GetAmountFF($sPath) Local $iPID = Run(@ComSpec & " /c dir /b /s " & $sPath, @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) Sleep(50) Local $sConsole Do $sConsole &= StdoutRead($iPID) If @error Then ExitLoop Until Not Sleep(10) StringReplace($sConsole, @CRLF, @CRLF) Return @extended + 1 EndFunc
Allerdings hab ich noch ein Problem damit die Anzahl der Dateien für $iMax zu ermitteln, da ich nur 5 von 6 Ordnern sichern möchte. Dachte an _FileListToArrayRec() weil ich den einen Ordner übers Exclude auslassen kann, aber das liefert mir rund 250 Dateien weniger als es wirklich sind.
Spoiler anzeigen
AutoIt
Alles anzeigen#include <Array.au3> #include <File.au3> #include <MsgBoxConstants.au3> #include <Constants.au3> $ignorePath= "6" ;der Ordner den ich nicht brauche Global $anzahl = _FileListToArrayRec("c:\myprog\", "*||" & $ignorePath, 0, 1, 1, 2) ;_ArrayDisplay($anzahl) ;Global Const $sPath7Zip = '"c:\Program Files\7-Zip\7z.exe"' ;nicht sinvoll, besser 7z.exe (u. 7z.dll) per FileInstall in die @Systemdir bringen Global $sFiles = 'c:\myprog\1 -i!c:\myprog\2 -i!c:\myprog\3 -i!c:\myprog\4 -i!c:\myprog\5' Global $sArchive = '"c:\myprog.7z"' SevenZipAdd($sFiles, $sArchive) Func SevenZipAdd($sFiles, $sArchive) Local $iMax = $anzahl Local $iPID = Run("7z.exe a -r " & $sArchive & " " & $sFiles, @SystemDir, @SW_SHOW, $STDERR_MERGED) Sleep(50) Local $sConsole, $sLine, $iUB ProgressOn("Progress Meter", "Adding to archive", "0 % (0 / " & $iMax & ")") Do $sConsole &= StdoutRead($iPID) If @error Then ExitLoop $aResult = StringRegExp($sConsole, "(Compressing\h+.*)", 3) $iUB = UBound($aResult) $iPerc = Int($iUB / $iMax * 100) ProgressSet($iPerc, $iPerc & " % (" & UBound($aResult) & " / " & $iMax & ")") Until Not Sleep(10) ProgressOff() EndFunc
Irgendwelche Vorschläge?
-
Hi @all
Beschäftige mich seit langem mal wieder mit AutoIt und möchte eine Backup Funktion in ein Programm einbauen. Die soll "lediglich" ein paar Ordner/Dateien mit Progressbar in ein Archiv packen, welches sich möglichst mit Windows Bordmitteln entpacken lässt. Hab schon ein paar Bsp. gefunden, die entweder nicht funktioniert haben, oder sich nicht wie gewünscht integrieren lassen. Hat jmd. ne Idee nach was man so suchen kann? Danke im Voraus!
-
-
Hab den Code im 1. Post geändert
-
Habe jetzt was zusammen bekommen, was auch zu funktionieren scheint
Kann man das evtl. noch etwas eleganter "zusammenkürzen"?
-
Hi @ all
versuche krampfhaft aus einem Array Variablen zu erstellen, komme aber nicht zu Rande.Spoiler anzeigen
AutoIt
Alles anzeigen#include <Array.au3> #include <File.au3> Global $folder[4] $folder[0] = "A" $folder[1] = "B" $folder[2] = "C" $folder[3] = "D" Local $main = @HomeDrive & "\MyProg1\Main\" DirCreate($main) For $i = 0 To UBound($folder) - 1 DirCreate($main & $folder[$i]) For $j = 1 To 2 DirCreate($main & $folder[$i] & "\Daten" & $j) Next Next _FileCreate($main & "A\Daten1\abc4730.txt") _FileCreate($main & "A\Daten2\abc4750.txt") _FileCreate($main & "B\Daten1\abc3210.txt") _FileCreate($main & "B\Daten2\abc3190.txt") _FileCreate($main & "C\Daten1\abc2680.txt") _FileCreate($main & "C\Daten2\abc2650.txt") _FileCreate($main & "D\Daten1\abc1330.txt") _FileCreate($main & "D\Daten2\abc1350.txt") MsgBox(0, "", _getInfo($main, '0')) DirRemove(@HomeDrive & "\MyProg1", 1) Func _getInfo($info, $info2) Local $aList = "" Local $bList = "" Local $cList = "" Local $dList = "" Local $aSplit For $i = 0 To UBound($folder) - 1 $Array = _FileListToArrayRec($info & $folder[$i], "abc*.txt", 1, 1, 1, 1) ;_ArrayDisplay($Array) If IsArray($Array) Then ;ExitLoop _ArrayColInsert($Array, 1) ;_ArrayDisplay($Array) For $j = 1 To $Array[0][0] $Array[$j][1] = StringMid($Array[$j][0], StringInStr($Array[$j][0], '\', 2, -1) + 1) Next ;_ArrayDisplay($Array) _ArraySort($Array, 1, 1, 0, 1) ;_ArrayDisplay($Array) _ArrayColDelete($Array, 1) ;_ArrayDisplay($Array) $bList = StringSplit($Array[1][0],"\") ;_ArrayDisplay($bList) ;$aList &= $bList[UBound($bList)-2]& "-" & StringReplace(StringReplace($Array[1][1], $info2 & ".txt", ""), "abc", "") & "|" $aList &= $bList[UBound($bList)-2]& "-" & StringReplace(StringReplace($bList[UBound($bList)-1], $info2 & ".txt", ""), "abc", "") & "|" Else $aList &= 0 & "-" & 0 & "|" ;$bList &= 0 & "-" EndIf Next $aArray = StringSplit(StringTrimRight($aList, 1), "|") ;_ArrayDisplay($aArray) Global $aCount[$aArray[0]] For $k = 1 To UBound($aArray) - 1 $bArray = StringSplit($aArray[$k], "-") ;_ArrayDisplay($bArray) $cList &= $bArray[2] & "-" $aCount[$k-1] = _change($bArray[1]) Next _ArrayDisplay($aCount) Return StringTrimRight($cList, 1) EndFunc Func _change($cmd) If ($cmd = "Daten1") Then Return "Daten2" ElseIf ($cmd = "Daten2") Then Return "Daten1" Else Return 0 EndIf EndFunc
Das was der Returnwert liefert passt schon, aber wie krieg ich den Row[1] Wert aus dem $bList Array zu einer seperaten "gegensätzlichen" Variable? Sprich wenn Daten1 im Array angezeigt wird als Variable Daten2 rauskommt und umgekehrt.
Sieht auch alles recht wild aus, vllt. lässt es sich auch noch kürzen? Danke schonmal im Voraus!
-
Danke an euch beide für Eure Antworten!
Ich Dutz habe die For Next Schleife vergessen darum ging es nicht
Die ZAHL ändert sich auch wöchentlich, so das öfters auch dort mal eine 0 enthalten sein kann - darum denke ich die Nullen zu Replacen ist keine Gute Idee. Nur das abc und (je nach Version) das 0.txt oder D.txt bleibt gleich.
EDIT:
Das StringReplace ist gar nicht so schlecht...StringReplace(StringReplace($level, $type & ".txt", ""), "abc", "")
Muss dann nur vorher die Version abfragen und als $type deklarieren.
-
Hi @ all
muss das hier nochmal ausgraben weil ich es mit dem $pattern nicht wirklich gebacken kriegen.Habe 2 Strings aus denen nur die ZAHLen benötigt werden.
abcZAHL0.txt -> Die Null vorm Punkt wird nicht benötigt.
abcZAHLD.txt
Gibt es da evtl. eine Möglichkeit?
-
@Kanashius & chesstiger
Danke erstmal für eure Antworten!Habe bis vorgestern an mir selbst gezweifelt, dann hab ich rausgefunden das mas ein Script u. die comp. EXE "sowieso" mit ESC beenden kann. Das hatte ich vorher noch nie ausprobiert (Kann man das evtl. auch ausschalten?)
Es sollte das Script während/nach einer "fehlgeschlagener" Treiberinstallation (mit Fehlercode) beenden - funktioniert aber nich so einfach wie gedacht. Habe rausgefunden, das ein fehlendes KB Update dafür verantwortlich war. Habe dann eine Checkfunktion eingefügt, die schaut ob das Update installiert ist und eine weitere die den Status abfragt u. ggf. an dieser Stelle abbricht.
-
Hi @ all
ist es möglich einen Hotkey nur zuzulassen, wenn das Script in einer best. Funktion hängen bleibt?Dachte an...
Code
Alles anzeigen_test() Func _test() HotKeySet("{ESC}", "_abort") ;mach was ;bleibt hängen ;Abbruch mit ESC EndFunc Func _abort() Exit EndFunc
...funktioniert aber nich so wie gedacht
-
Hi @all
wie kann man seine EXE mit 2 Parametern (exe -i -s) gleichzeitig starten? Mit einem gehts ja recht gut, aber mit nem 2. krieg ichs nicht hin
Spoiler anzeigen
Danke
-
Hi @all
möchte einen Treiber via DevCon installieren und ggf. deinstallieren, wenn das Gerät nicht richtig erkannt und als Unbekanntes Gerät gelistet wird.
[autoit]RunWait(@ComSpec & ' /c ' & 'devcon.exe install ' & @TempDir & '\my.inf root\mydevice', @SystemDir, @SW_hide)
[/autoit]
Mit dem Befehl soll gestartet werden. Wo bekomme ich nun die Information her, ob die Aktion erfolfreich war oder nicht?Wenn es nicht erfolgreich war möchte ich rausbekommen, mit welcher INF Datei ich dann das Treiberpaket entfernen kann.
[autoit]RunWait(@ComSpec & ' /c ' & 'devcon.exe drivernodes root\mydevice', @SystemDir, @SW_hide)
[/autoit]
Mit diesem Befehl bekommt man das übers CMD raus. Gibt es evtl. noch andere Möglichkeiten? Über die Registry (HKLM\SYSTEM\CurrentControlSet\Services\mydevice)? Habe echt keine Idee was da "sicherer" istLöschen würd ich es dann so
[autoit]RunWait(@ComSpec & ' /c ' & 'devcon.exe remove ' & $var & ' root\mydevice', @SystemDir, @SW_hide)
[/autoit]Aber am Wichtigsten ist erstmal das "Errorhandling" vom ersten Befehl.
Danke schonmal im Voraus.
-
Bei mir z.B. ist alles deaktiviert und da funktioniert das soweit ganz gut. Sollen noch ein paar andere Leute bekommen, deren System ich nicht kenne. Wenn nicht muss ich Ihnen dazu sagen, dass sie UAC deaktivieren und es ggf. "Als Administrator ausführen" sollen.
-
So schwer sind die Befehle nicht auseinander zu halten- Schau mal in der Hilfe nach.
Ist richtig, wollte nur wissen welcher der Optimale ist. Weis nicht ob SC ausgeführt wird, wenn z.B. UAC aktiviert ist? Habe das Script oben geändert und möchte gern wissen, ob das "Fachlich" korrekt ist oder ob ich eine Variable ausser acht gelassen habe bzw. was verbessert werden kann?Wo ich auch noch keine Lösung gefunden habe ist, dass der Service im Geräte Manager unter Nicht-PnP-Treiber (auch nach einem Neustart) nicht gelistet wird. Im Regedit haben alle im Gerätemanager gelisteten Nicht-PnP-Treiber den Eintrag Capabilities;REG_DWORD;0 aufgeführt. Ist dieser Eintrag dafür verantwortlich? Wenn ja, wie kann ich Ihn setzen? Über Regwrite, die Reg.exe, eine .reg Datei oder im Regedit selber bekomme ich keine Zugriff darauf
-
Hi @all
Ich möchte einen Dienst mit SC über ein Script erstellen. Leider blicke nicht so recht mit den möglichen Befehlen durch Da gibts ja den Run/Runwait, _RunDos, RunAs/RunAsWait, dann kommt noch das @ComSpec dazu und ich hab keine Ahnung was ich nehmen soll...
Ist der RunAs/RunAsWait nötig, wenn #RequireAdmin im Script vorhanden ist?
So schaut das Script bis jetzt aus...
Spoiler anzeigen
AutoIt
Alles anzeigen#RequireAdmin #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #NoTrayIcon #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Meine GUI", 200, 114, 349, 249) $Button1 = GUICtrlCreateButton("Starten", 6, 11, 187, 25) $Button2 = GUICtrlCreateButton("Beenden", 5, 44, 187, 25) $Button3 = GUICtrlCreateButton("Exit", 5, 76, 187, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE Exit Case $Button1 _ServiceStartStop(1) Case $Button2 _ServiceStartStop() Case $Button3 Exit EndSwitch WEnd Func _ServiceStartStop($sFlag = 0) If $sFlag = 1 Then If _IsServiceRunning('Abhängigkeit') = True Then If _IsServiceRunning('MyService') = False Then RunWait(@ComSpec & ' /c sc.exe create MyService type= "own" start= "system" binpath= "' & @SystemDir & '\drivers\my.SYS" DisplayName= "MyService"', @SystemDir, @SW_HIDE) If Not @error Then RunWait(@ComSpec & ' /c sc.exe config "MyService" depend= "Abhängigkeit"', @SystemDir, @SW_HIDE) RunWait(@ComSpec & ' /c sc.exe start MyService', @SystemDir, @SW_HIDE) MsgBox(64, "Information", "Ist gestartet.", 0, $Form1) Else MsgBox(64, "Information", "Kann nicht gestartet werden.", 0, $Form1) EndIf Else MsgBox(64, "Information", "Läuft bereits...", 0, $Form1) EndIf Else MsgBox(64, "Information", "Abhängigkeit fehlt...", 0, $Form1) EndIf Else If _IsServiceRunning('MyService') = True Then RunWait(@ComSpec & " /c sc.exe stop MyService", @SystemDir, @SW_HIDE) If Not @error Then RunWait(@ComSpec & " /c sc.exe delete MyService", @SystemDir, @SW_HIDE) MsgBox(64, "Information", "Erfolgreich beendet...", 0, $Form1) Else MsgBox(64, "Information", "Kritischer Fehler!" & @CRLF & "Kann nicht beendet werden.", 0, $Form1) EndIf Else MsgBox(64, "Information", "Ist schon beendet...", 0, $Form1) EndIf EndIf Func _IsServiceRunning($sService) Local $oShell = ObjCreate('shell.application') If @error Then Return SetError(1, 0, False) EndIf Return $oShell.IsServiceRunning($sService) EndFunc ;==>_IsServiceRunning
Danke schonmal...
-
Ich hoffe das ich so alle möglichen Fehler berücksichtigt habe...?
Spoiler anzeigen
AutoIt
Alles anzeigen#include <File.au3> #include <Array.au3> $pattern = "(\d+)" $aList = _FileListToArray("daten") Global $aNew[$aList[0]] For $i = 1 To $aList[0] $aDaten1 = _FileListToArray("daten" & "\" & $aList[$i] & "\daten1", "stand*.txt") If IsArray($aDaten1) Then Local $aRegEx1 = StringRegExp($aDaten1[1], $pattern, 3) Else Local $aRegEx1 = StringRegExp("0", $pattern, 3) EndIf $aDaten2 = _FileListToArray("daten" & "\" & $aList[$i] & "\daten2", "stand*.txt") If IsArray($aDaten2) Then Local $aRegEx2 = StringRegExp($aDaten2[1], $pattern, 3) Else Local $aRegEx2 = StringRegExp("0", $pattern, 3) EndIf $sTest = Number($aRegEx1[0]) > Number($aRegEx2[0]) If $sTest = 1 Then $aNew[$i - 1] = $aRegEx1[0] ;ConsoleWrite($sNew & @CRLF) Else $aNew[$i - 1] = $aRegEx2[0] ;ConsoleWrite($sNew & @CRLF) EndIf Next MsgBox(0, "", $aNew[0] & "/" & $aNew[1] & "/" & $aNew[2] & "/" & $aNew[3])
Vllt. gehts ja noch ein bißchen kompakter -
Natürlich solltest du das ganze Errorhandling nicht vergessen!
Oh ja, danke für den wichtigen Hinweis!!! Damit sollte ich schon ganz oben anfangen. Hab nämlich mal einen der Daten1/2 Ordner gelöscht und schon bricht die ganze Sache ab, weil ja die Grundlage nicht mehr da ist.
Sollte ich da mit einem FileExists() prüfen ob der Pfad vorhanden ist oder mir mit If @error irgendwas ausdenken?
EDIT: habe ein BSP. in der Hilfe gefunden, mit dem werde ich mich heute abend mal beschäftigen...
-
Hab mir das gestern nochmal angeschaut und auch mal ein paar Bsp. probiert, damit ich das mit dem Array mal nachvollziehen kann.
So schauts jetzt aus...
Spoiler anzeigen
AutoIt
Alles anzeigen#include <File.au3> #include <Array.au3> $pattern = "(\d+)" $aList = _FileListToArray("daten") Global $sNew[4] For $i = 1 To $aList[0] $aDaten1 = _FileListToArray("daten" & "\" & $aList[$i] & "\daten1", "stand*.txt") $aDaten2 = _FileListToArray("daten" & "\" & $aList[$i] & "\daten2", "stand*.txt") $aRegEx1 = StringRegExp($aDaten1[1], $pattern, 3) $aRegEx2 = StringRegExp($aDaten2[1], $pattern, 3) If $aRegEx1[0] > $aRegEx2[0] Then Global $sNew = $aRegEx1[0] Else Global $sNew = $aRegEx2[0] EndIf MsgBox(0, "", $sNew) Next
Kannst du mir noch sagen welche bewandnis das Number() in deinem Bespiel hatte?Habe auch probiert das Ergebnis ($sNew) pro Durchlauf in eine Variable zu bringen aber irgendwie klappt das nicht
Dachte $sNew[$i] = vor dem $aRegEx1+2 würde reichen, tut es aber nicht. Muss da auch noch eine For Next Schleife rein?