Ja/Nein-Abfrage vor Ausführen eines ButtonBar-Befehles

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Ja/Nein-Abfrage vor Ausführen eines ButtonBar-Befehles

Post by *franc »

Hallo,

geht das irgendwie, dass ich vor dem Ausführen eines Befehles den ich in der Button Bar untergebracht habe eine Abfrage kriege, ob ich das wirklich tun will oder doch lieber Abbrechen?
Ich habe nämlich einen Shortcut auf sdelete (das Tool von Sysinternals, das richtig löscht) dort untergebracht, mit den Parametern:

-p 3 -s %P%N

Und jetzt habe berechtigte Angst, dass ich damit mal aus Versehen mächtig was löschen kann :-)

Edit: sdelete hat keinen so nutzbaren Parameter

Danke, Gruß franc
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1052
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

Ne einfache Lösung per Batchdatei (zB als "AbfrageLoeschen.cmd"):

Code: Select all

@ECHO OFF
CLS
ECHO Die Datei %1 soll endgültig gelöscht werden!
ECHO.
SET /P ergebnis=Wirklich? (JA/...) 
IF "%ergebnis%"=="JA" GOTO LOESCHFUNKTION
GOTO ABBRECHEN

:LOESCHFUNKTION
ECHO Datei %1 wird gelöscht
c:\programme\sysinternals\sdelete.exe -p 3 -s %1
GOTO ENDE

:ABBRECHEN
ECHO Aktion wird nicht durchgeführt
GOTO ENDE

:ENDE
ECHO Fertig
PAUSE
Über Button mit Command "AbfrageLoeschen.cmd %P%N" aufrufen.
User avatar
karlchen
Power Member
Power Member
Posts: 4605
Joined: 2003-02-06, 22:23 UTC
Location: Germany

Post by *karlchen »

Hallo, Franc.

Eine echte Ja/Nein-Abfrage bekommst du zwar damit nicht, aber eine Dialogbox, die dir u.a. die Möglichkeit gibt, die Aktion doch noch zu stornieren. Und das ist es ja, was du erreichen möchtest.
totalcmd.chm => Dialogbox: Konfigurieren - Buttonbar ändern wrote:Parameter: Hier können Kommandozeilenparameter angegeben werden. Diese sind nur wirksam, wenn hinter Kommando: ein externes Programm steht, z.B. notepad. Fixe Parameter müssen direkt hinter dem Dateinamen angegeben werden, da beim Drag&Drop stets nur die fallengelassene Datei als Parameter übergeben wird.

Spezielle Parameter:

? als erster Parameter bewirkt, dass eine Dialogbox mit den nachfolgenden Parametern aufgerufen wird. In dieser Dialogbox können die Parameter geändert, bzw. weitere Parameter hinzugefügt werden. Ausserdem kann die Programmausführung noch verhindert werden.
Dezenter Hinweis:
Wenn man dabei ist, einen Buttonbarbefehl zu erzeugen/ändern, und dann F1 drückt, erhält man genau den o.a. zitierten Hilfetext.


Dein Parameterfeld sähe dann so aus:
? -p 3 -s %P%N
Grüße,
Karl
User avatar
norfie²
Power Member
Power Member
Posts: 1038
Joined: 2006-02-10, 07:27 UTC

Post by *norfie² »

Sicheres Loeschen? Wozu? Daten, die es noetig haben, werden heutzutage verschluesselt und nur auf entsprechender Rechentechnik verarbeitet. Dann eruebrigt sich "sicheres" Loeschen einzelner Dateien von vornherein, welches sowieso nicht sicherstellt, dass die Daten nicht doch noch irgendwo auf der Festplatte liegen. Die schnelle Variante "sicheren" Loeschens: die Originaldatei auf 0 Byte zuruecksetzen, mit einem zufaelligen Namen umbenennen und danach einfach loeschen.
http://ghisler.ch/board/viewtopic.php?p=54514#54514
http://www.heise.de/foren/S-Sicher-loeschen-trotz-Schattenkopie/forum-49283/msg-15337712/read/
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

karlchen wrote: Dein Parameterfeld sähe dann so aus:
? -p 3 -s %P%N
Super! Genau sowas einfaches hab ich gesucht! Danke!

Dank auch an H. Zoster! Das ist natürlich die elegantere Lösung!

Gruß franc
User avatar
karlchen
Power Member
Power Member
Posts: 4605
Joined: 2003-02-06, 22:23 UTC
Location: Germany

Post by *karlchen »

Hallo, franc.
franc wrote:Dank auch an H. Zoster! Das ist natürlich die elegantere Lösung!
Aber nur in den Fällen, in denen man ohnehin eine Scriptdatei aufrufen möchte, der man dann wie von Zoster gepostet, ein bißchen Intelligenz einpustet.
Das Voranstellen des ? ist universell einsetzbar und auch von den Benutzern zu bewerkstelligen, die es mit dem Scripten nicht so haben. :)

Apropos Eleganz:
So richtig elegant wäre das Script, wenn es ohne GOTOs auskäme, mit Pfadangaben umgehen könnte, die Leerzeichen enthalten, und die Antwort in Groß- oder Kleinbuchstaben eingegeben werden könnte, vielleicht so:

Code: Select all

@ECHO OFF
setlocal enableextensions enabledelayedexpansion
CLS
ECHO Die Datei "%~1" soll endgültig gelöscht werden!
ECHO.
SET /P ergebnis=Wirklich? (JA/...) 
IF /i "%ergebnis%"=="JA" (
   ECHO Datei "%~1" wird gelöscht
   c:\programme\sysinternals\sdelete.exe -p 3 -s "%~1"
   ECHO Fertig
) else (
   ECHO Aktion wird nicht durchgeführt
)
pause
endlocal
Und perfekt würde die Sache, wenn das Script nun noch überprüfen würde, ob
+ überhaupt ein Aufrufargument angegeben wurde ("%1" NEQ "")
+ ob das Aufrufargument "%1" überhaupt existiert
und wenn die deutschen Umlaute statt im Ansi- im Ascii-Code ausgegeben würden. :wink:

<Korrektur>

Da bin ich aber mit meiner Mängelliste übers Ziel deutlich hinausgeschossen. Peinlich. Peinlich. Äußerst peinlich. :oops: :oops: :oops:

Hier also die kleinen Brötchen:
  • Vorab: Natürlich tut das von Zoster gespostete Script das, wofür es gedacht ist: Aufgerufen per T.C. Button übergibt es die selektierte Datei auf Nachfrage an SDelete, und das löscht die Datei dann.
  • Das gilt auch für Dateinamen mit Leerzeichen (anders als von mir unterstellt)!
    Über den Aufrufparameter %P%N stellt Total Commander sicher, dass Namen mit Leerzeichen von den benötigten doppelten Anführungszeichen umschlossen werden.
    D.h. solange das Script per T.C. Button aufgerufen wird, ist die Verwendung von %1 ausreichend überall dort, wo ich es durch "%~1" ersetzt hatte. Letzteres schadet nicht, ist aber unter den vorgegebenen Laufbedingungen des Scripts nicht erforderlich.
    (Das kommt davon, wenn man zu faul ist, einen Button anzulegen, und stattdessen von der Kommandozeile aus testet, also ohne Einsatz von %P%N.)
  • Über die deutschen Umlaute: Das Problem, dass im cmd.exe Fenster deutsche Umlaute als ANSI Zeichen und damit falsch ausgegeben werden, taucht natürlich auf, wenn man Zosters Script aus dem Forum z.B. in Notepad kopiert und einfach abspeichert.
    Wenn man es entweder über edit.com verfaßt oder einen Editor benutzt, der OEM-Zeichensatz schreibt, dann dürften die deutschen Umlaute auch richtig erscheinen.
    Aber immerhin, man sollte drauf aufpassen, auch wenn es nur ein kosmetisches Problem ist.
  • die Überprüfung, ob überhaupt ein Aufrufargument übergeben wurde und ob die Datei überhaupt existiert, ist hinfällig, wenn das Script per Buttonbar aufgerufen wird und T.C. die selektierte Datei per %P%N an das Script übergibt.
Soviel also zu den Mängeln, die keine waren.

</Korrektur>

Grüße,
Karl
Last edited by karlchen on 2009-06-05, 12:42 UTC, edited 2 times in total.
User avatar
Mikefield
Power Member
Power Member
Posts: 628
Joined: 2006-02-26, 19:13 UTC
Location: Oberursel, Germany HE

Post by *Mikefield »

2Karlchen Meinst Du nicht, daß

Code: Select all

enableextensions enabledelayedexpansion
dafür etwas oversized ist? Das wäre ja wie Trabbi mit Turbolader und Bremskraftverstärker ... :)
Und eine Unterdrückung der SDelete Startmeldung wäre noch perfekter ...

mf
Bankster - Word of the Year 2009
User avatar
karlchen
Power Member
Power Member
Posts: 4605
Joined: 2003-02-06, 22:23 UTC
Location: Germany

Post by *karlchen »

Hallo, Mikefield.
Meinst Du nicht, daß

Code: Select all

enableextensions enabledelayedexpansion
dafür etwas oversized ist?
Nö, meine ich nicht. :)
"setlocal ... endlocal" stellt sicher, daß ich mir keine Gedanken darüber machen muß, am Ende des Scripts nicht mehr benötigte Variablen zu entfernen.
"enablextensions" stellt sicher, daß "IF /I" funktioniert und unabhängig von Groß/Kleinschreibung vergleicht.
Und bevor ich mir große Gedanken darüber mache, nehme ich die letzte Option "enabledelayedexpansion" auch immer mit rein. Damit vermeidet man im Fall des Falles, daß Variablen zur falschen Zeit und nur einmal ausgewertet werden. (Spielt in diesem Script eher keine Rolle, aber innerhalb von Schleifen.)
Und eine Unterdrückung der SDelete Startmeldung wäre noch perfekter ...
Naja, das Anliegen müßtest du schon an Mark Russinovich richten. Der scheint aber gerne sicherzustellen, daß seine Copyright Meldung erscheint. Kannst es ja mal mit "2> nul" versuchen. Leider unterdrückt das auch Fehlemeldungen, die nach stderr geschrieben werden.

Grüße,
Karl
User avatar
Mikefield
Power Member
Power Member
Posts: 628
Joined: 2006-02-26, 19:13 UTC
Location: Oberursel, Germany HE

Post by *Mikefield »

Hallo Karl!
karlchen wrote:"setlocal ... endlocal" stellt sicher, daß ich mir keine Gedanken darüber machen muß, am Ende des Scripts nicht mehr benötigte Variablen zu entfernen.
Das habe ich auch nicht "bemängelt"! :)
"enablextensions" stellt sicher, daß "IF /I" funktioniert und unabhängig von Groß/Kleinschreibung vergleicht.
Das bezweiflle ich, daß für "IF /I" "enablextensions" benötigt wird! Aber es ist oft die "Macht der Gewohnheit" die Erweiterungen zu laden, man weiß ja nie, wo einen der Weg in 'ner Batch noch hinführt. :)
Kannst es ja mal mit "2> nul" versuchen. Leider unterdrückt das auch Fehlemeldungen, die nach stderr geschrieben werden.
Yepp, und deshalb habe ich es gar nicht erst in Betracht gezogen. :)

mf
Bankster - Word of the Year 2009
User avatar
karlchen
Power Member
Power Member
Posts: 4605
Joined: 2003-02-06, 22:23 UTC
Location: Germany

Post by *karlchen »

Hallo, Mikefield.

Über "enableextensions" und "enabledelayedexpansion":

Das zu Beginn jeder Batchdatei zu setzen, ist einfach eine Vorsichtsmaßnahme.

Nach meinem Wissensstand wird cmd.exe vorgabemäßig mit "enableextensions" gestartet. Darum wird er in der Regel "IF /I" verstehen. Wenn jedoch cmd.exe per Kommandozeile oder über die Registry gestartet wird ohne dass die Erweiterungen eingeschaltet sind, dann funktioniert "IF /I" eben nicht.
If command extensions are enabled, use the following syntax:
if [/i] string1 CompareOp string2 command [else expression]
(Vgl. dazu IF und cmd)

Bei "enabledelayedexpansion" bin ich mir nie sicher, ob das vorgabemäßig ein oder aus ist.

Also ist doch folgendes eine gute Leervorlage zu einem Script und verhält sich immer so wie erwartet:
@echo off
setlocal enableextensions enabledelayedexpansion

endlocal
Über die SDELETE Startmeldung:
Sdelete schreibt die Startmeldung nach stdout. D.h. 2>nul bringt ohnehin nicht das gewünschte Ergebnis.
Es bliebe also höchstens die Möglichkeit
+ entweder mittels "find" oder "findstr" Befehlen die Startmeldungen auszufiltern
+ oder mittels "for"-Schleife die ersten 3 Zeilen auszufiltern und nur den Rest auszugeben
Ich glaube, der Erfolg rechtfertigt den Aufwand nicht.

Ansonsten:
Habe meine Mängelliste noch mal überdacht und korrigiert :oops: :
Die ursprüngliche Anforderung war lediglich, eine im T.C. selektierte Datei per Button an Sdelete zu übergeben und auf Nachfrage zu löschen. Das erledigt Zosters Script sehr wohl. Damit beschränkt sich mein Script auf 1 kosmetische Änderung, keine GOTOs, und die Möglichkeit, die Abfrage nicht nur mit "JA", sondern auch mit "Ja", "ja" oder "jA" beantworten zu können, also ohne Berücksichtigung von Groß- und Kleinschreibung.
(Der Berg kreiste und gebar eine Maus.)

Wer Interesse daran hat oder sowas benötigt:
Hier gibt es einen Forums-Thread, My handy sdelete scripts, in dem versucht wird, ein universelles Sdelete-Script zu entwickeln, dass per Explorer-Kontextmenü aufgerufen werden kann. Es soll damit möglich sein, sowohl einzelne Dateien zu löschen, als auch ganze Verzeichnisbäume rekursiv.
Hinweis:
So ganz wurde das Ziel, alle möglichen Einsatzgebiete abzudecken, nicht erreicht. Es besteht also auch dort noch Verbesserungspotential. - Vielleicht nimmt man aber auch einfach Heidi's Eraser. :wink:

Grüße,
Karl
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

karlchen wrote:...
Vielleicht nimmt man aber auch einfach Heidi's Eraser
Der Eraser hat den riesengroßen Nachteil, dass er nicht in einem Thread läuft, sondern die Anwendung, die ihn aufruft (z.B. Totalcmd / Explorer) so lange blockiert, bis der Eraser fertig gelöscht hat.

Bei einem DVD-Image z.B. kann das durchaus lange dauern (bei mehrmaligen Löschdurchgängen). Man wird hierdurch zu noch mehr Kaffeetrinken gezwungen ;-)

Ich hab auch schon mal in den Quelltext reingeschaut, aber da bin ich nicht sattelfest genug. Eines Tages dann... :-)
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

2franc
Der Eraser hat den riesengroßen Nachteil, dass er nicht in einem Thread läuft, sondern die Anwendung, die ihn aufruft (z.B. Totalcmd / Explorer) so lange blockiert, bis der Eraser fertig gelöscht hat.
Ungetestet: So sollte cmd.exe das Programm starten und sich selbst wieder beenden:

Code: Select all

Kommando: %comspec% /c
Parameter: start programm.exe
Vielleicht hilft's?
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

StatusQuo wrote:...So sollte cmd.exe das Programm starten und sich selbst wieder beenden...
Eraser hat meines Wissens leider keine Kommandozeilen-Argumente.
Post Reply