Jump to content

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

Auf Prozessende warten und dann herunterfahren



  • Please log in to reply
40 replies to this topic
nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ja du hast es genau falsch herum gemacht.

Die Errorlevel Variable wird auf 0 gesetzt wenn der Prozess nicht da ist.

Also es wird nicht gewartet sondern Heruntergefahren wenn der Prozess existiert.



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

;###########################################################
CCleaner := A_Is64bitOS ? "ccleaner64.exe" : "ccleaner.exe"
; Ist es ein 64 bit System?
;###########################################################

If (FileExist("C:\Program Files\CCleaner")) ;  Pruefe ob der Ordner vorhanden ist
{
Run, C:\Program Files\CCleaner\%CCleaner% /Auto, , ; Der CCleaner laeuft versteckt und automatisch mit den aktuell gespeicherten Optionen um den PC zu reinigen

Sleep, 5000 ; warte 5 Sekunden, da die Bereinigung auch auf schnellen Systemen einige Sekunden dauert

SetTimer, Shutdown, 1000 ; erstelle einen Timer, und wiederhole ihn jede Sekunde (in Millisekunden)
Return ; ENTER
 }

Else ; wenn C:\Program Files\CCleaner nicht gefunden wurde, den naechstmoeglichen Pfad testen

{
Run, C:\Program Files (x86)\CCleaner\%CCleaner% /Auto, ,  UseErrorLevel; Der CCleaner laeuft versteckt und automatisch mit den aktuell gespeicherten Optionen um den PC zu reinigen
If ErrorLevel ; der CCleaner wurde nicht an den ueblichen Zielen gefunden
MsgBox, Der CCleaner wurde nicht gefunden!`n`nEventuell wird eine portable Version verwendet, oder die Installation wurde in`neinem anderen Ordner oder auf einem anderen Laufwerk durchgeführt!

Sleep, 5000 ; warte 5 Sekunden, da die Bereinigung auch auf schnellen Systemen einige Sekunden dauert

SetTimer, Shutdown, 1000 ; erstelle einen Timer, und wiederhole ihn jede Sekunde (in Millisekunden)
Return
}

Shutdown: ; was soll der Timer genau machen:
Process, Exist, %CCleaner% ; prueft ob der CCleaner Prozess noch laeuft
If !ErrorLevel ; wenn der CCleaner Prozess nicht mehr gefunden wird - fuehre den naechsten Befehl aus
Run, C:\Windows\System32\shutdown.exe /s /f /t 0, ,Hide ; fuehre shutdown.exe versteckt (, "Arbeitsverzeichniss" , Hide) aus und fahre den PC herunter (Schalter /s), beende alle laufenden Prozesse sofort (Schalter /f), zeige keinen Dialog an und warte nicht mit dem Herunterfahren (Schalter: /t 0  =  0 Sekunden)
Return

Visit the new forum ahkscript.org.

http://ahkscript.org


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

Hallo nnnik,

vielen Dank für Deine Überarbeitung.
Ein kleines Problemchen gab es noch, dies konnte ich jedoch selbst lösen. Im Falle das der CCleaner gar nicht an den üblichen Zielen vorhanden ist, wird die MsgBox angezeigt, und nach dem Schließen der Box wird dann ja das Script weiter abgearbeitet, also der PC heruntergefahren. Dies ist natürlich nicht beabsichtigt, falls der CCleaner nicht vorhanden ist.

Daher hier meine Änderung:
 

....
If ErrorLevel ; der CCleaner wurde nicht an den ueblichen Zielen gefunden
{
MsgBox, Der CCleaner wurde nicht gefunden!`n`nEventuell wird eine portable Version verwendet, oder die Installation wurde in`neinem anderen Ordner oder auf einem anderen Laufwerk durchgeführt!
ExitApp
}
Else
Sleep, 5000 ; warte 5 Sekunden, da die Bereinigung auch auf schnellen Systemen einige Sekunden dauert
....

Das gesamte Script sieht nun so aus:
 

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

;###########################################################
CCleaner := A_Is64bitOS ? "ccleaner64.exe" : "ccleaner.exe"
; Ist es ein 64 bit System?
;###########################################################

If (FileExist("C:\Program Files\CCleaner")) ;  Pruefe ob der Ordner vorhanden ist
{
Run, C:\Program Files\CCleaner\%CCleaner% /Auto, , ; Der CCleaner laeuft versteckt und automatisch mit den aktuell gespeicherten Optionen um den PC zu reinigen

Sleep, 5000 ; warte 5 Sekunden, da die Bereinigung auch auf schnellen Systemen einige Sekunden dauert

SetTimer, Shutdown, 1000 ; erstelle einen Timer, und wiederhole ihn jede Sekunde (in Millisekunden)
Return ; ENTER
 }

Else ; wenn C:\Program Files\CCleaner nicht gefunden wurde, den naechstmoeglichen Pfad testen

{
Run, C:\Program Files (x86)\CCleaner\%CCleaner% /Auto, ,  UseErrorLevel; Der CCleaner laeuft versteckt und automatisch mit den aktuell gespeicherten Optionen um den PC zu reinigen
If ErrorLevel ; der CCleaner wurde nicht an den ueblichen Zielen gefunden
{
MsgBox, Der CCleaner wurde nicht gefunden!`n`nEventuell wird eine portable Version verwendet, oder die Installation wurde in`neinem anderen Ordner oder auf einem anderen Laufwerk durchgeführt!
ExitApp
}
Else
Sleep, 5000 ; warte 5 Sekunden, da die Bereinigung auch auf schnellen Systemen einige Sekunden dauert

SetTimer, Shutdown, 1000 ; erstelle einen Timer, und wiederhole ihn jede Sekunde (in Millisekunden)
Return
}

Shutdown: ; was soll der Timer genau machen:
Process, Exist, %CCleaner% ; prueft ob der CCleaner Prozess noch laeuft
If !ErrorLevel ; wenn der CCleaner Prozess nicht mehr gefunden wird - fuehre den naechsten Befehl aus
Run, C:\Windows\System32\shutdown.exe /s /f /t 0, ,Hide ; fuehre shutdown.exe versteckt (, "Arbeitsverzeichniss" , Hide) aus und fahre den PC herunter (Schalter /s), beende alle laufenden Prozesse sofort (Schalter /f), zeige keinen Dialog an und warte nicht mit dem Herunterfahren (Schalter: /t 0  =  0 Sekunden)
Return

Vielen Dank an alle die bei diesem Projekt geholfen haben!!!
Aber es funktioniert doch nicht wie gewünscht.

Eigentlich sollen ja nur 4 mögliche FileExist Pfade abgefragt werden:

Priorität 1) "C:\Program Files\CCleaner\CCleaner64.exe"

Priorität 2) "C:\Program Files (x86)\CCleaner\CCleaner64.exe"
Priorität 3) "C:\Program Files (x86)\CCleaner\CCleaner.exe"

Priorität 4) "C:\Program Files\CCleaner\CCleaner.exe"

anschließend soll mit der jeweiligen Version der Befehl /Auto ausgeführt werden.
Sollte keiner der 4 Pfade zutreffen, dann:
 

MsgBox, Der CCleaner wurde nicht gefunden!`n`nEventuell wird eine portable Version verwendet, oder die Installation wurde in`neinem anderen Ordner oder auf einem anderen Laufwerk durchgeführt!
ExitApp

Falls der CCleaner Vorgang erfolgreich durchgeführt wurde, soll der PC heruntergefahren werden.
Also:
 

SetTimer, Shutdown, 1000 ; erstelle einen Timer, und wiederhole ihn jede Sekunde (in Millisekunden)
Return
Shutdown: ; was soll der Timer genau machen:
Process, Exist, %CCleaner% ; prueft ob der CCleaner Prozess noch laeuft
If !ErrorLevel ; wenn der CCleaner Prozess nicht mehr gefunden wird - fuehre den naechsten Befehl aus
Run, C:\Windows\System32\shutdown.exe /s /f /t 0, ,Hide ; fuehre shutdown.exe versteckt (, "Arbeitsverzeichniss" , Hide) aus und fahre den PC herunter (Schalter /s), beende alle laufenden Prozesse sofort (Schalter /f), zeige keinen Dialog an und warte nicht mit dem Herunterfahren (Schalter: /t 0  =  0 Sekunden)
Return

Aber ich bin hier leider überfordert, vielleicht gibt es noch Ideen?



fredchf
  • Members
  • 111 posts
  • Last active: Oct 10 2015 02:08 PM
  • Joined: 02 Nov 2012

Hallo!

Man könnte natürlich auch einfach mit 

RunWait, Ziel [, Arbeitsverzeichnis, Max|Min|Hide|UseErrorLevel, AusgabevariablePID]

arbeiten...

nicht getestet:

Spoiler


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

Hallo fredchf,

 

vielen Dank für Deine Arbeit,

 

das funktioniert zwar grundsätzlich, scheitert aber an einem CCleaner spezifischen Problem, siehe nächster Post.
Trotzdem sehr schön das Du es optimiert hast.



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

Es gibt ein CCleaner spezifisches Problem:

Bei älteren Installationen des CCleaners werden auch bei Updates auf die neueste Version in einem 64 bit System die CCleaner Dateien in
C:\Program Files (x86)\CCleaner\ccleaner64.exe gespeichert. Dies ist der Tatsache geschuldet das es vor der Version 3 des CCleaners keine 64 bit Version gab.

Damit funktioniert natürlich die Abfrage und Bestimmung des Betriebssystems nicht mehr korrekt!

Ich dachte das ich mich ganz simpel mit der folgenden Abfrage behelfen kann, aber das funktioniert leider auch nicht:
Die "MsgBox, CCleaner gefunden in:" dient natürlich nur der Kontrolle, und soll im fertigen Script verschwinden.
Den Timer habe ich hier auch weggelassen, der Übersicht halber. Aber es wird keine MsgBox angezeigt, offensichtlich habe ich einen Denkfehler im Script...

Spoiler


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

Weil dir dieser wundervolle Kommentar das Script zerschießt!

/*#############################################################
Der CCleaner wird an den typischen Installationspfaden gesucht
#############################################################*/

Durch das /* am Zeilenanfang kommentierst du alles aus, bis das nächste */ an einem Zeilenanfang gefunden wird - und da das nicht vorhanden ist, ist das das gesamte Script auskommentiert :)

 

 

Entweder so

/*
#############################################################
Der CCleaner wird an den typischen Installationspfaden gesucht
#############################################################
*/

oder so

;#############################################################
;Der CCleaner wird an den typischen Installationspfaden gesucht
;#############################################################

Aber niemals so, wie du es notiert hast.

 

the /* and */ symbols can be used to comment out an entire section, but only if the symbols appear at the beginning of a line


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


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

Und jetzt nochmal zur Logik und zum Aufbau.

 

Abläufe, die mehrfach verwendet werden, packt man am besten in eine Funktion. Damit wird der Code insgesamt leserlicher und übersichtlicher. Außerdem konzentriert sich die Fehlerwahrscheinlichkeit auf die Funktion und verteilt sich nicht auf jede einzelne Wiederholung.

 

Die Abfrage der Registry liefert dir den Installationspfad - egal wo das Ding zuletzt installiert wurde. Jetzt kannst du zusätzlich noch abfragen, ob das Teil auch wirklich dort ist.

 

Die Tatsache alleine, dass die x64.exe vorhanden ist, sagt nichts darüber aus, ob es ein x64-OS ist.

Beides ist im Paket und da sich CCleaner vollkommen chaotisch ins System integriert, halte ich es auch für möglich, dass das SetUp die x64.exe auf x86-Maschinen mit entpackt.

In der Portable ist jedenfalls beides enthalten. Also muss sowohl die Existenz der passenden .exe, als auch die Art des OS geprüft werden, um sicher zu sein.

 

Ich habe aber auch gesehen, dass sich die CCleaner.exe auf einem x64-System selber beendet und die CCleaner64.exe startet. Wegen des Chaos-Faktors würde ich mich aber nicht darauf verlassen, dass das bei allen Versionen so ist.

 

Wenn das alles berücksichtigt und erfolglos ist, kann man noch den MUI-Cache danach durchsuchen, ob nur eine Portable Version gestartet wurde. Das ist der Fall, wenn NUR der Eintrag im MUI-Cache vorhanden ist.

 

Scheitert das alles, fragt man beim User ab, wo sich die Datei befindet. In der Regel mit FileSelectFile und Speichern der User-Eingabe in einer .ini


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 umfangreiches Feedback.

Wie peinlich:
 

the /* and */ symbols can be used to comment out an entire section, but only if the symbols appear at the beginning of a line

Das wäre mir wahrscheinlich in 100 Jahren nicht aufgefallen da ja /* und */ vorhanden waren, und genau das war es auch!!!!!
 

Die Tatsache alleine, dass die x64.exe vorhanden ist, sagt nichts darüber aus, ob es ein x64-OS ist.

Beides ist im Paket und da sich CCleaner vollkommen chaotisch ins System integriert, halte ich es auch für möglich, dass das SetUp die x64.exe auf x86-Maschinen mit entpackt.

In der Portable ist jedenfalls beides enthalten. Also muss sowohl die Existenz der passenden .exe, als auch die Art des OS geprüft werden, um sicher zu sein.

Du hast recht, ich glaube das Ganze Projekt wird einfach zu mächtig. Ob auf 32 bit Installationen auch die 64 bit entpackt wird kann ich heute Abend gleich mal bei meiner Perle nachsehen.
Aber zumindest für mich kann ich ja die Else / If Geschichte aus diesem Post so umbauen das Sie auf jedem 64 bit System funktioniert.
 

Ich habe aber auch gesehen, dass sich die CCleaner.exe auf einem x64-System selber beendet und die CCleaner64.exe startet. Wegen des Chaos-Faktors würde ich mich aber nicht darauf verlassen, dass das bei allen Versionen so ist.

Na ja aber das kann man ja umgehen indem man zuerst die CCleaner64.exe in Program Files oder Program Files (X86) abfragen würde...
Allerdings gebe stimme ich Dir zu das dieses als "einfach" angedachte Projekt, jeden Rahmen sprengen wird.

Daher werde ich wohl auch meine Bemühungen diesbezüglich einstellen, und bedanke mich abschließend bei Allen die mitgeholfen haben.



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

Sehe ich nicht so. Bei der Energie, die du da bisher reingesteckt hast, müssen jetzt die einzelnen Bausteine nur noch zusammengesteckt werden.

 

Es ist aber immer etwas anderes, ob man etwas für sich bastelt, was bei einem selbst funktioniert - oder ob man jeden 'Fehler' und die möglichen Variationen bedenken muss, die auf einem anderen System angetroffen werden könnten.

 

Jedenfalls ist das ja scheinbar ein allgemeines Problem und so, wie ich das herauslese, ist CCleaner zwar in der Lage, wüste Löschorgien durchzuführen und hat sogar einen ShutOff-Schalter - nur funktioniert der unter Win7/8 nicht wie er soll.


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

Bei der Energie, die du da bisher reingesteckt hast, müssen jetzt die einzelnen Bausteine nur noch zusammengesteckt werden.

Na ja nur noch würde ich da jetzt nicht sagen...
 

... wie ich das herauslese, ist CCleaner zwar in der Lage, wüste Löschorgien durchzuführen ...

Ich sehe schon Du bist kein Fan des CCleaners ;-)
 

und hat sogar einen ShutOff-Schalter - nur funktioniert der unter Win7/8 nicht wie er soll.

Na ja schon, mit /AUTO und /SHUTDOWN tut er es aber, es kommt dann eigentlich immer die berüchtigte Meldung:
Es wird darauf gewartet dass Hintergrundprogramme geschlossen werden.
Das finde ich persönlich sehr unprofessionell.

Zwar kann man Windows dieses Verhalten mit 2 Registry Modifikationen abgewöhnen, aber das wird ja der Normaluser kaum tuen wollen (und auch nicht müssen!!!)

Dieses Verhalten kann man Windows ja mit den entsprechenden Shutdown Schaltern direkt abgewöhnen.
shutdown /s /f /t 0
Erklärung:
/s  bewirkt das Herunterfahren
/f  erzwingt das Schließen ausgeführter Anwendungen ohne Warnung
/t  gibt das Zeitlimit für das Herunterfahren an, t 0 = 0 Sekunden, also sofort! Ohne Zeitangabe wird der Standart: 30 Sekunden ausgefuehrt

Wobei sich der User darüber im Klaren sein muss, das hierbei alles gnadenlos abgeschossen wird.



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

happy.png

 

Falls du dich noch anders entscheiden solltest, hier noch ein Ansatz, wie man auf ein Programm warten und dessen Pfad ermitteln kann

	WinWait, Piriform CCleaner
	WinGet, CCleanerPID, PID, Piriform CCleaner
	For Process In ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process where Handle=" . CCleanerPID)
	MsgBox % Process.ExecutablePath

Das ist eine brauchbare Alternative, wenn man dem User nicht zumuten will, sich mit FileSelectFile durch seine Verzeichnisse zu hangeln.


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 sehe schon, Du willst es auch nicht kampflos aufgeben.
Das kann ich natürlich auch nachvollziehen, bei all der Zeit und Energie die Du in dieses Projekt investiert hast ;-)

Da bin ich ja praktisch moralisch verpflichtet am Ball zu bleiben. Allerdings kann es sein das ich da erst in der nächsten Woche wieder dazu komme.
Ok, wir beerdigen das Projekt noch nicht...



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

najut happy.png

 

Damit du keine Langeweile bekommst, hier noch einer...

For Item In ComObjGet("winmgmts:").ExecQuery("Select * from CIM_DataFile where (FileName = 'CCleaner' or FileName = 'CCleaner64') and Extension = 'exe'")
MsgBox,4160,, % "Dateiname`t" Item.FileName "." Item.Extension "`n"
              . "Version`t`t" Item.Version "`n"
              . "Hersteller`t`t" Item.Manufacturer "`n"
              . "Pfad\Datei`t" Item.Name "`n"
              . "Größe`t`t" Item.FileSize "`n"
              . "Type`t`t" Item.FileType "`n"
              . "Pfad`t`t" Item.Drive Item.Path

Allerdings ist das nur so eine Art Rettungsfallschirm, weil das auch mal etwas länger dauern kann.


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

@Seidenweber - @HotKeyIt - @just me - @nnnik - @fredchf

Also bei einer 32 bit Installation wird der CCleaner64.exe nicht im Programmverzeichnis entpackt, es gibt also nur die ccleaner.exe.
Folgendes Skript habe ich unter folgenden Konstellationen getestet:

Windows 7 64 bit Ultimate  - - -  Programmpfad: C:\Program Files\CCleaner\CCleaner64.exe
Windows 7 64 bit Professional  - - -  Programmpfad: C:\Program Files (x86)\CCleaner\CCleaner64.exe
Windows 7 32 bit Professional  - - -  Programmpfad: C:\Program Files\CCleaner\CCleaner.exe
 

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

; ###########################################################
CCleaner := A_Is64bitOS ? "ccleaner64.exe" : "ccleaner.exe"
; Ist es ein 64 bit System?
; ###########################################################

If (FileExist("C:\Program Files\CCleaner")) ;  Pruefe ob der Ordner vorhanden ist
    RunWait, C:\Program Files\CCleaner\%CCleaner% /Auto, , ; Der CCleaner laeuft versteckt und automatisch mit den aktuell gespeicherten Optionen um den PC zu reinigen
Else ; wenn C:\Program Files\CCleaner nicht gefunden wurde, den naechstmoeglichen Pfad testen
    {
        RunWait, C:\Program Files (x86)\CCleaner\%CCleaner% /Auto, ,  UseErrorLevel; Der CCleaner laeuft versteckt und automatisch mit den aktuell gespeicherten Optionen um den PC zu reinigen
        If ErrorLevel ; der CCleaner wurde nicht an den ueblichen Zielen gefunden
            {
                MsgBox,
                ( Join
                Der CCleaner wurde nicht gefunden!`n`nEventuell wird eine portable Version verwendet, oder die Installation wurde in einem anderen Ordner oder auf einem anderen Laufwerk durchgeführt!
                )
                ExitApp
            }
    }
    

SetTimer, Shutdown, 1000 ; erstelle einen Timer, und wiederhole ihn jede Sekunde (in Millisekunden)
Return

Shutdown: ; was soll der Timer genau machen:
Process, Exist, %CCleaner% ; prueft ob der CCleaner Prozess noch laeuft
If !ErrorLevel ; wenn der CCleaner Prozess nicht mehr gefunden wird - fuehre den naechsten Befehl aus
Run, C:\Windows\System32\shutdown.exe /s /f /t 0, ,Hide ; fuehre shutdown.exe versteckt (, "Arbeitsverzeichniss" , Hide) aus und fahre den PC herunter (Schalter /s), beende alle laufenden Prozesse sofort (Schalter /f), zeige keinen Dialog an und warte nicht mit dem Herunterfahren (Schalter: /t 0  =  0 Sekunden)
Return

Das dürfte die meisten Anwendungsfälle abdecken, bei "normaler" Installation, kein Portable oder angepasster Programmpfad.
Schön wäre es wenn der ein oder andere das noch mal hinsichtlich der UAC testen könnte. Denn auf allen Rechnern war die UAC Off.


 



fredchf
  • Members
  • 111 posts
  • Last active: Oct 10 2015 02:08 PM
  • Joined: 02 Nov 2012

Hallo nochmal!

Das folgende Script sollte eigentlich auf allen Plattformen und Installationen funktionieren. 



#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
try
  RunWait, % A_ProgramFiles "\CCleaner\" (A_Is64bitOS ? "ccleaner64.exe" : "ccleaner.exe") " /Auto" 
catch e
{
  MsgBox, 262160, Fehler bei Aufruf von CC, % "Folgender Fehler trat auf:`n" e.Message "`n" e.Extra
  ExitApp   , bei Problemen nicht runterfahren
}
Run, %A_WinDir%\System32\shutdown.exe /s /f /t 0, ,Hide