FAQs: TC Automatisieren Skripten (Generelle Infos)

German support forum

Moderators: white, Hacker, Stefan2

User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

FAQs: TC Automatisieren Skripten (Generelle Infos)

Post by *Stefan2 »

In diesem Thread soll das Wissen über die Automatisierung und Scriptierung
innerhalb des TCs sowie die Steuerung des TCs von außen gesammelt werden.



TC-interne Parameter:
Der TC stellt einige Parameter über den aktuellen Stand bereit, welche man in einem Skript verarbeiten kann.
(zB aktueller aktiver und Ziel-Pfad sowie eine Liste der ausgewählten Dateien)
Die TC-internen Parameter findet man in der Hilfe bei einer Suche nach 'button',
welche den Abschnitt 'Dialogbox: Konfigurieren - Buttonbar ändern' finden sollte.
Du kannst auch einen Button über das Kontextmenü zum bearbeiten öffnen und dort die F1-Taste auf der Tastatur drücken.


TC-interne Befehle:
Des Weiteren kann man den TC von außen mittels 'SendMessage'/'PostMessage' -Funktionen steuern bzw. Informationen erfragen.
Hierfür existieren externe Tools und Beispielskripte.
(Psuedo-Code: SendMessage WM_USER+50, 1011, 0, , TTOTAL_CMD)
Die TC-internen Befehle stehen in der Textdatei 'TOTALCMD.INC' bzw. in der 'History.txt', Stichwort: 'WM_USER'.





Allgemeine Info:

Die oben erwähnten Informationen muss man meistens in einem externen Skript verarbeiten.
Als Skript-Engine stehen DOS MS-Batch (*.bat, *.cmd), 'Windows Script Host' Skriptsprachen (VBScript, JavaScript),
AutoHotkey (*.ahk), PowerShell (*.ps1), PowerPro u.s.w. bereit.


Beachte, dass der TC eigene Umgebungsvariablen bereit stellt, welche du verwenden kannst,
um Pfadangaben relative zum Ordner des laufenden TCs anzugeben.
zB: %COMMANDER_PATH% und %COMMANDER_DRIVE% (siehe http://www.ghisler.ch/wikide/index.php/Navigation)
Anstelle von "C:\Temp\tests\meinSkript.vbs" kannst du das Skript in den TC-Ordner legen und mittels "%Commander_Path%\meinSkript.vbs" aufrufen.


Mit den in diesem Post angegebenen Stichwörtern kann man noch mehr Informationen und Beispiele im Forum, im Wiki sowie in der History.txt finden.
(Das Meiste dieser Informationen hier stammt ebenfalls von da, geschrieben vor langer Zeit von erfahrenen Anwendern)
http://www.ghisler.ch/wikide/index.php/Automatisierung
https://www.ghisler.ch/wikide/index.php/AutoHotkey
http://www.ghisler.ch/wiki/index.php/PowerPro


Meistens sind im Forum gefundene Skripte speziell für einen besonderen Fall geschrieben worden, sodass wahrscheinlich Anpassungen für deinen speziellen Fall nötig sind.


Manche Skripte enthalten zur Sicherheit anstatt aktiver Befehle erst mal Testausgaben, es können sich diese schwarzen 'DOS-Fenster'
(Befehlszeileninterpreter-Eingabe-Fenster) öffnen und / oder es sind 'Pause-Befehle' eingebaut. Nach dem der Anwender das Skript so getestet
hat und die Meldungen einen Sinn ergeben, können diese 'Debug'-Informationen entfernt werden, um das Skript ungehindert laufen zu lassen.


Weitergehende Hilfe zur allgemeinen Anpassung von Skript findest du über Google in entsprechenden 'Fach'-Foren.
Es macht meist keinen Sinn, hier noch einmal alles zu wiederholen. Ausnahme natürlich ganz spezifische Anpassungen zu deiner Anfrage.


Teste so ein Skript erst mal mit einem kleinen Teil deiner Dateien.
Kopiere diese zum Beispiel nach "C:\Temp\Ordner mit Leerzeichen\".
Es ist auch eine gute Idee zuerst ein Backup deiner Dateien anzulegen.
Eventuell macht das Skript nicht das was du von ihm erwartest, daher ist Vorsorge sehr sinnvoll.


Wenn du um Hilfe bittest, poste ein paar Beispiel Pfade\Dateien in TEXTform, wie diese jetzt sind und wie du sie haben möchtest.
Gerne auch mit Screenshot (Anfänger müssen nötige URLs mit Leerzeichen posten), aber reiner Text macht das Nachstellen des Problems einfacher.



- - - - - - - - - - - - - - - - - - - - - - - -

Inhalt:



Post 1 - Button und Benutzerdefinierte Befehle
viewtopic.php?p=336056#336056
Ein Programm mit ausgewählter Datei starten
Einen neuen Button erstellen:
Button kopieren, speichern, laden, sichern, austauschen, einfügen: (TOTALCMD#BAR#DATA)
Eigenen 'Benutzerdefinierten Befehl' (BDB) erstellen:
Tastaturkürzel zuweisen:
Einen Alias vergeben:
Mehrere Befehle in einem Button:
Eine eigene, bzw. zusätzliche Buttonbar's anlegen:
Einen Button mit einer eigenen Buttonbar als PullDown-Menü einrichten:


Post 2 - Quoting / Anführungszeichen
viewtopic.php?p=336059#p336059
Korrektes Quoting / in Anführungszeichen setzen
Aufruf von Programmen mit eigenen Parametern und ausgewählten Dateien:
Eigene Test, welche Parameter und welche Anführungszeichen übergeben werden:



Post 3 - Aktionen für ausgewählte Dateien
viewtopic.php?p=336072#336072
Aktion für ausgewählte Dateien/Ordner ausführen
Beispiel Batch für EINE ausgewählte Datei:
Beispiel Batch für EINE ausgewählte Datei und mit zwei Parameter:
Beispiel Batch für eine oder MEHRERE ausgewählte Dateien:
Beispiel Batch für eine oder MEHRERE ausgewählte Dateien und drei Parametern:
Beispiel VBScript für eine oder MEHRERE ausgewählte Dateien:
PowerShell
AutoHotkey



Post 4 - Externe Tools zur Abarbeitung der ausgewählten Dateien
viewtopic.php?p=336232#336232
MakeBAT Christian Ghisler
List2multiInstance
List2Run
lst2clip
lst2str
TCBL\ Bat Builder Launcher



Post 5 - TC von außen steuern / SendMessage / WM_USER
viewtopic.php?p=346996#p346996
 

Post 6 - Externe Tools zur direkten Dateimanipulation
viewtopic.php?p=346997#p346997
<to do>
addtime\
redate\
TimeAdjust\
TimeCopy\
AskParam\
CopyToTabs\
DupSel\
extDir\
F4Menu\
F4MiniMenu\
NewFilePutFile\
NirSoft\ ?
NotePad2\





 
Last edited by Stefan2 on 2017-12-22, 15:03 UTC, edited 5 times in total.
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Autom: Button - Benutzer Befehl - Tastaturkürzel anlegen

Post by *Stefan2 »

 
Post 1 - Button und Benutzerdefinierte Befehle


Die einfachste Form der 'Automatisierung' ist ein Programm mit Parametern auszuführen.

Ein Programm mit ausgewählter Datei starten

Um eine ausführbare Datei (*.exe; *.cmd; *.vbs) mit einer oder mehreren Dateien als
Parameter aufzurufen, stellt der TC einige interne Parameter bereit.


TC-interne Parameter:
Der TC stellt einige Parameter über den aktuellen Stand bereit, welche man in einem Skript verarbeiten kann.
(zB aktueller aktiver und Ziel-Pfad sowie eine Liste der ausgewählten Dateien)
Die TC-internen Parameter findet man in der Hilfe bei einer Suche nach 'button',
welche den Abschnitt 'Dialogbox: Konfigurieren - Buttonbar ändern' finden sollte.
Du kannst auch einen Button über das Kontextmenü zum bearbeiten öffnen und dort die F1-Taste auf der Tastatur drücken.


Um eine ausführbare Datei im TC einzurichten, kann man diese einfach auf die Buttonbar ziehen (drag&drop)
und sie an einer freien Stelle los lassen (oder die Umschalt-Taste drücken zum "zwischen drin einfügen").
Danach klickt man mit der rechten Maustaste auf das neue Icon ("Ändern..."), um es zu konfigurieren.
Wie man Was konfiguriert folgt in den nächsten Posts...
(Siehe auch > http://www.ghisler.ch/wikide/index.php?title=Buttonbar)


Wenn man den Befehl mittels eines Tastaturkommandos aufrufen möchte, schreibt man besser einen 'Benutzerdefinierten Befehl'
(Beispielsnamen: "em_MeinBefehl"), (siehe http://www.ghisler.ch/wikide/index.php/Benutzerdefinierte_Befehle), nur diesem kann
man eine Tastenkombination zuweisen. Darüber hinaus kann man diesen 'em_MeinBefehl' auch wieder als Kommando in einem Button verwenden.


- - -


Einen neuen Button erstellen:


- Buttonbar > rechte Maustaste > "Ändern..."

- Im Button-Dialog, Links auf [Anfügen] klicken.
- Eigenschaften für den Befehl eingeben, z.B.:

- -- Kommando: Notepad
- -- -- -- -- (Oder auf das [Lupensymbol] klicken um den Befehlsbrowser zu öffnen um interne oder 'Benutzerdefinierte Befehle' auszuwählen)
- -- -- -- -- (Bei Leerzeichen (oder auch sonst) immer Anführungszeichen verwenden: "D:\rive\Pfad zum Ordner\NotePad.exe")
- -- Parameter: "%O.txt"
- -- -- -- -- (Drücke die F1-Taste zum lesen der Hilfe bzgl. der Parameter)
- -- Startpfad: (Falls der Befehl in einem bestimmten Ordner arbeiten soll. Ansonsten, wie meistens, leer lassen)
- -- Icondatei; Notepad (oder %Commander_Path%\WCMICONS.DLL)
- -- -- -- -- (Oder den Pfad zum Programm vom Kommando, oder z.B. %Commander_Path%\WCMICONS.DLL oder %windir%\system32\SHELL32.dll)
- -- Icon: <einmal rein-klicken, um die Icondatei zu laden, Icon aussuchen>
- -- Tooltip: Freier Text, zB: Erstelle Textdatei mit Namen unter Cursor|hier Zeilenumbruch.
- -- Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert
- [OK]
- [OK]
Fertig.
Mehr unter > http://www.ghisler.ch/wikide/index.php?title=Buttonbar


Meist sind nur die Angaben zu 'Kommando' , 'Icon' und 'Tooltip' notwendig, je nach Bedarf noch 'Parameter'. Der 'Startpfad' bleibt meist leer.


---

Die Button-Konfiguration wird in einer *.bar-Datei gespeichert, standardmäßig in der 'DEFAULT.BAR'

Code: Select all

button29=C:\Windows\system32\notepad.exe
cmd29=notepad
param29=""%O.txt""
iconic29=1
menu29=Erstelle Textdatei mit Namen unter Cursor|hier Zeilenumbruch.
---

Um aus einem Button einen 'Benutzerdefinierten Befehl' zu erstellen, muss man den 'Benutzerdefinierten Befehl' komplett neu anlegen.



- - -


Button kopieren, speichern, laden, sichern, austauschen, einfügen:


Tipp, man kann auch einen vorhandenen Button kopieren und wieder einfügen und danach konfigurieren.
Diesen Button-Code kann man auch zwischen Anwendern über das Forum austauschen.


Erklärung zu TOTALCMD#BAR#DATA

Code: Select all

TOTALCMD#BAR#DATA
cmd /k
?ECHO %P%N %T%M
C:\Windows\system32\cmd.exe
Hier eine |kurze Erklärung|als Tooltip


-1

Anwenden dieses Codes:
- den Code markieren (komplett von 'TOTALCMD#BAR#DATA' bis für letzten Ziffer, hier '-1')
> in die Zwischenablage kopieren
> rechts Klick auf die TC-Buttonbar am gewünschten Platz
> "Einfügen" auswählen.



Erklärung:
Zeile 1: dadurch kann der TC diesen Code in der Zwischenablage erkennen und den 'Einfügen'-Eintrag im Button-Kontextmenü einblenden.
Zeile 2: Der Befehl / das Kommando
Zeile 3: Die Parameter zum Befehl (das führende '?' bewirkt, dass das Kommando beim Ausführen erst mal angezeigt wird)
Zeile 4: Pfad zur Datei des Icons
Zeile 5: Der Tooltip
Zeile 6: Der Startpfad
Zeile 7: Aufrufparameter Als Symbol / maximiert (in der usercmd.ini ist das 'iconic')
Zeile 8: Die Nummer des internen TC-Befehls, falls Zeile 2 einen solchen beinhaltet, ansonsten '-1' bei anderen Befehlen.


Weitere Hilfe:
Drücke im geöffneten Button-Dialog (rechts Klick auf die Buttonbar > Ändern...) die F1-Taste um die Hilfe zu den Parameter zu lesen.
Klicke dort auf das Lupen-Symbol Icon um eine Liste der TC-internen Befehle zu sehen.


- - -


Eigenen 'Benutzerdefinierten Befehl' (BDB) erstellen:


- Buttonbar > rechte Maustaste > "Ändern..."

- Im Button-Dialog
- -- (Falls neuer Button gewünscht, links auf [Anfügen] klicken, ansonsten einfach mit der nächsten Zeile weitermachen)
- -- auf das [Lupensymbol] klicken.

- -- Kategorie "usercmd.ini" auswählen.
- -- [Neu...] anklicken
- -- -- Name für den benutzerdefinierten Befehl eingeben, zB 'em_usercmd1' (das "em_" muss sein!)
- -- -- [OK] klicken
- -- -- Eigenschaften für den Befehl eingeben.
- -- -- z.B.:
- -- -- --- Kommando: Notepad
- -- -- --- Parameter: "%O.txt"
- -- -- --- Startpfad:
- -- -- --- Icondatei: Notepad (oder %Commander_Path%\WCMICONS.DLL)
- -- -- --- Icon:
- -- -- --- Tooltip: Erstelle Textdatei|mit Namen unter Cursor.
- -- -- --- Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert
- -- -- [OK]
- -- Den Befehlsbrowser mit [OK] schließen.

- Den Button-Dialog mit [OK] schließen. (Oder [Abbrechen], falls man nur den BDB anlegen wollte)
Fertig.
Mehr unter > http://www.ghisler.ch/wikide/index.php/Benutzerdefinierte_Befehle


Meist sind nur die Angaben zu 'Kommando' , 'Icon' und 'Tooltip' notwendig, je nach Bedarf noch 'Parameter'. Der 'Startpfad' bleibt meist leer.


Fall noch nicht vorhanden, wurde jetzt eine Textdatei 'usercmd.ini' im TC-Ordner angelegt.

Inhalt:

Code: Select all

[em_usercmd1]
button=notepad
cmd=notepad
param=""%O.txt""
path=
iconic=1
menu=Erstelle Textdatei|mit Namen unter Cursor.

Diesen Eintrag kann man auch kopieren und über das Forum austauschen, danach einfach in die eigene usercmd.ini rein kopieren.


Diesen neuen em_Befehl (hier 'em_usercmd1') kann man in einem Button bei "Kommando" eintragen,
in der TC-Kommandozeile eingeben, einem Alias zuweisen, oder einem Tastaturkürzel.


Um aus einem 'Benutzerdefinierten Befehl' einen Button zu erstellen, kann man den Namen des 'Benutzerdefinierten Befehls' einfach im Button als Kommando angeben.
Alle Angaben aus der 'usercmd.ini' werden als Button-Parameter übernommen.
Von daher macht es Sinn, in der 'usercmd.ini' alle Paramter anzugeben.


Die 'usercmd.ini' -Textdatei sowie deren Inhalt kann man auch 'von Hand', also ohne Dialog erstellen.


(benutzer-definierte kommando benutzerbefehl em-befehl em-kommando)





Tastaturkürzel zuweisen:

Weise einem Befehl (em_ oder cm_) ein Tastaturkürzel zu

- Öffne "Konfigurieren > Einstellungen > Diverses"
- Bei Tastaturkürzel wähle eine freie Kombination
- Klicke auf das Vergrößerungsglas um ein Kommando auszusuchen
- Tippe em_ (oder cm_) zum filtern und wähle das gewünschte Kommando (z.B.: em_Rechner)
- [OK]
- [OK]
- Fertig.







Argument-Platzhalter(%A) zur Übergabe von Argumenten:

Mit den 'Argument-Platzhalter' kann man die Benutzerbefehle beim Erstellen flexibler auf Anforderungen zur Laufzeit vorbereiten.


Dafür stehen die Platzhalter '%A' sowie '%A1' bis '%A9' zur Verfügung.

'%A' fügt alle übergebene Argumente ein, '%A1' nur den Ersten, '%A4' den Vierten, usw.



Beispiel:

[em_sel]
cmd=SELECTFILES
param=%A

Jetzt kann man in der TC-Kommandozeile zB 'em_sel *.txt *.log' verwenden.
Dieses wird zu 'SELECTFILES *.txt *.log' expandiert.

Mittels eines Aliases 's' (Siehe nächsten Abschnitt) kann man den Befehl auf 's *.txt *.log' verkürzen.





Weiteres Beispiel:

Zuerst erstelle einen Benutzerdefinierten Befehl:
[em_StarteTC_AliasTest]
cmd=%COMMANDER_EXE%
param=/L=%A1 /R=%A2
menu=Starte TC mit zwei Parametern

Hier wurden '%A1' und '%A2' als Platzhalter eingesetzt, welche durch
die bei der späteren Anwendung eingegebenen Argumente ersetzt werden.


Jetzt könnte man bereits 'em_StarteTC_AliasTest C:\Temp D:\Temp' eingeben,
Ergibt Befehlszeile: %COMMANDER_EXE% /L=C:\Temp /R=D:\Temp
aber der Name des Benutzerbefehls ist zu lang zum merken und eintippen.

Erstelle daher jetzt einen Alias 'tc' um in der TC-Kommandozeile Tipparbeit zu sparen







Einen Alias vergeben:

Mit einem ALIAS kann man sich das tippen von Namen von 'Benutzerdefinierten.' und Internen- Befehlen vereinfachen.
Anstelle von 'cm_CommandBrowser' reicht es dann zB ein 'cbr' ein zu tippen.

Auch wenn man einen Benutzerbefehl mit aussagekräftiger Bezeichnung hat,
wie zB 'em_Ordner_MitAktuellemDatum_erstellen', kann man diesen mit einem Alias abkürzen auf zB 'MDheute'


Beispiel:

"Konfigurieren > Einstellungen > Diverses ==> Tastenkombination umdefinieren"

- (o) Alias: gebe 'tc' ein.
- Befehl: "cm_StarteTC_AliasTest" (Siehe den vorherigen Abschnitt)
- [OK]



Anwendung zB in der TC-Kommandozeile:
tc C:\Temp D:\Temp


Ergibt Befehlszeile:
%COMMANDER_EXE% /L=C:\Temp /R=D:\Temp
welche den aktuellen TC nochmals startet und dabei die übergebenen Argumenten auswertet und in den beiden Panels (/L + /R) öffnet.
(Siehe die TC-Hilfe > Kommandozeilenparameter)


- - -


Weiteres Beispiel:

"Konfigurieren > Einstellungen > Diverses ==> Tastenkombination umdefinieren"

- (o) Alias: gebe zB 'cbr' ein.
- Befehl: "cm_CommandBrowser"
        (Klicke auf das [Lupensymbol] um den Befehlsbrowser zu öffnen. Im 'Filter:' tippe 'cm_comm')
- [OK]


Jetzt kannst du in der TC-Kommandozeile 'cbr' eintippen, um den 'CommandBrowser'-Dialog (Anzeige der internen Befehle) zu öffnen.



Nützlicher sind Aliase meistens zum Aufrufen von Benutzerdefinierten Befehlen (BDB).
Solch ein selbst erstelltes Kommando kann zB externe Programme oder ein Skript/Batch starten.
Als Befehl für den Alias gibt man dann den Namen seines BDB ein, und kann somit mit wenigen getippten Buchstaben komplexe Aktionen auslösen.


Solche ALIAS-Kommandos können auch die '%A'-Parameter zur Weitergabe von Argumenten enthalten.

- - -


Anderes Beispiel:

Hier erstellen wir ein Skript welches mittels eines Aliases gestartet wird,
wobei Argumente übergeben werden können, welche im Skript ausgewertet werden.


Man hat ein Skript A.cmd
---------------
@ECHO OFF
ECHO %1
PAUSE
---------------



Und einen Benutzerdefinierten Befehl em_A:
[em_A]
cmd=A.cmd


Erstelle jetzt einen Alias 'a'
- (o) Alias: gebe 'a' ein.
- Befehl: "em_A"
- [OK]

Anwendung zB in der TC-Kommandozeile:
a Hallo

Startet die A.cmd mit 'Hallo' als Argument, welche dann wiederum das Argument mittels 'ECHO' ausgibt.


- - -

Noch ein Beispiel:
icfu wrote: 2007-11-13, 19:38 UTC
e.g. through a user defined command
(em_MkDirDate, type "NewDir" in the dialog and get "20071113_NewDir" created
Can be done like that:

Code: Select all

[Alias]
mdd=em_MkDirDate

[em_MkDirDate]
cmd=%comspec% /c
param=md "%%date:~-4,4%%%%date:~-7,2%%%%date:~-10,2%%_%A"
Note the "%A" which will be replaced by user input


Usage:
mdd NewDir

Icfu
icfu wrote: Aliases are meant to be typed(!) in command line, as an alternative to a
button, a shortcut, a starter or menu entry. So, if you want to create a
directory NewDir, just type "mdd NewDir" in command line and it will work.

[Alias]
mdd=em_MkDirDate

[em_MkDirDate]
cmd=%comspec% /c
param=md "%%date:~-4,4%%%%date:~-7,2%%%%date:~-10,2%%_%A"

Put an alias placeholder where you want to have
an alternative text every time. See the %A in the code above.

Then you can use:
=> mdd NewDir

to get an new dir with current date and an flexible part at place of the %A



If you need a shortcut: Assign Ctrl+Shift+F7 to em_MkDirDate in Configuration -> Misc, or edit INI:
[Shortcuts]
CS+F7=em_MkDirDate

Edit the user-defined command and
prepend a question mark in parameters field
to have a dialog box open whenever you press the shortcut:
param=?md "%%date:~-4,4%%%%date:~-7,2%%%%date:~-10,2%%_%A"
icfu wrote: 2007-11-13, 22:17 UTC Aliases are meant to be typed(!) in command line, as an alternative to a button, a shortcut, a starter or menu entry.
So, if you want to create a directory NewDir, just type "mdd NewDir" in command line and it will work.

If you need a shortcut: Assign Ctrl+Shift+F7 to em_MkDirDate in Configuration -> Misc, or edit INI:

Code: Select all

[Shortcuts]
CS+F7=em_MkDirDate
Edit the user-defined command and prepend a question mark in parameters field
to have a dialog box open whenever you press the shortcut:
param=?md "%%date:~-4,4%%%%date:~-7,2%%%%date:~-10,2%%_%A"

It would be much better if TC would only request the relevant parameter %A in this case of course
but until now %A only has an effect in command line. Should be requested...

Icfu







Mehrere Befehle in einem Button:

Seit 2014 und TC v8.50 kann man mehrere Befehle mit einem Button oder BDB ausführen, Beispiel:
Kommando: cm_About,cm_HelpIndex,cm_FtpConnect

- - -

Für manche internen Befehle, vor allem diejenigen mit Parametern, muss man zu erst einen
Benutzerdefinierten Befehl erstellen, und kann dann diesen em_Befehl als Kommando verwenden.

- - -


Tipps:

Die Befehle in einem Button oder in der usercmd.ini werden wie eine "DOS" Batchdatei behandelt.
Daher bitte die Prozentzeichen '%' bei Benutzerdefinierten 'DOS'-Variablen (nicht bei TC-Parametern) verdoppelt.


Umgebungsvariablen ("%comspec%", "%WinDir%", "%Commander_Path%") können nur im Kommando-Feld verwendet werden.
TC-interne Parameter (%P%N, "%T", %S) können nur im Parameter-Feld verwendet werden.
(Es soll auch Ausnahmen geben, aber hiermit ist man auf 'der sicheren Seite')


Bitte beachte das korrekte 'Quoten' / 'in Anführungszeichen setzen', oftmals muss man hier ausprobieren.
Der TC setzt Anführungszeichen je nach Bedarf, je nachdem ob Leerzeichen im Pfad\Namen sind oder nicht.
(zB: "%P" setzt man selbst in Anführungszeichen. Bei %P%N macht das der TC selbst, hier könnte man auf "%P%O.%E" ausweichen)
Das erschwert das Skripten, aber man kann generell Anführungszeichen (ob vorhanden oder nicht) im Skript entfernen und explizit eigenhändig setzen.


Bitte beachte auch, dass der TC seine Pfadvariable "%P" mit einem Backslash am Ende liefert: "C:\Temp\"
Manche "Empfänger" interpretieren den Backslash so, dass das folgende Anführungszeichen ignoriert wird: "C:\Temp
Hier kann es helfen, den Backslash zu verdoppeln, indem man "%P\" verwendet: "C:\Temp\\" (oder versuche "%P." > "C:\Temp\.")






Eine eigene, bzw. zusätzliche Buttonbar's anlegen:

Wenn man in der Buttonbar mehr Platz benötigt, oder diese komplett neu aufbauen möchte,
oder einfach seine Buttons sortieren möchte, dann kann man ganz einfach neue Buttonbars erstellen
und zwischen Buttonbars hin und her wechseln.


Vorgehensweise:

- Rechte Maustaste auf Buttonbar
- Ändern...
- - Buttonbar [>>]
- - Dateiname [ MeineNeueBar.bar ] *.bar ( gib das '.bar' mit ein! )
- - [Öffnen]

- - -

Jetzt wurde eine neue Textdatei 'MeineNeueBar.bar' im TC-Ordner angelegt.
Als nächstes kann man jetzt diese neue Bar mit Buttons füllen.

- - -

Als erstes sollte man eine Rückkehr zur Standard-Bar einbauen:
Im neuen Buttonbar-Dialog (falls bereits geschlossen, wieder 'Rechte Maustaste auf Buttonbar > Ändern...')
- [Anfügen]
- - Kommando: default.bar
- - Icondatei: %Commander_Path%\WCMICONS.DLL
- - Tooltip: Zurück zur DEFAULT.bar
- - [OK]

Es erscheint ein Hinweis, ob dies die neue Toolbar sein soll, welche immer geladen wird.
Wähle erst mal [Nein] (es sei denn, du möchtest in Zukunft immer mit dieser noch recht Leeren arbeiten)
---------------------------
Total Commander
---------------------------
Möchten Sie diesen Buttonbar permanent festlegen?
Er wird dann bei jedem Start von Total Commander geladen.
---------------------------
Ja Nein
---------------------------


Falls man aus Versehen [Ja] angeklickt hatte, kann man das korrigieren, indem man die wincmd.ini öffnet,
die "[Buttonbar]"-Sektion sucht, und die neue Zeile "Buttonbar=L:\aufwerk\Pfad zu\TotalCmd\MeineNeueBar.bar" komplett raus löscht.
Alternativ kann man wieder wie gezeigt > Buttobar > Ändern... > [>>] > die default.bar auswählen > die Nachfrage mit [Ja] bestätigen.


- - -

Jetzt hat man eine neue Toolbar, bei der der erste Button die standardmäßige default.bar öffnet.
Aber die neue Bar kann man nirgends öffnen? Nur so wie oben gezeigt über den [>>]-Knopf.

Dazu kann man in der standardmäßigen default.bar ebenfalls einen Button anlegen,
welcher wiederum deine neue 'MeineNeueBar.bar' öffnet:

- auf die standardmäßige default.bar wechseln
- [Anfügen]
- - Kommando: MeineNeueBar.bar
- - Icondatei: %Commander_Path%\WCMICONS.DLL
- - Tooltip: Zurück zu MeineNeueBar.bar

Um das Icon innerhalb der Buttonbar zu verschieben, öffne den Buttonbar Änder-Dialog und ziehe das Icon an die gewünschte Stelle.

- - -

Damit hat man zwei Bars, welche man über die angelegten Buttons im Wechsel öffnen kann. Natürlich geht das auch mit mehreren,
zB 5 oder 6 sind eine überschaubare Anzahl und bieten jede Menge Platz, auch zum einsortieren von Buttons zu verschiedenen Themen.

- - -


Anstelle eine neue Bar zu erstellen und einzurichten, kann man auch eine vorhandene Bar laden

Hier ist eine kleine *.bar Datei als Beispiel,... einfach als Textdatei "_ExampleBAR.bar" im TC-Ordner abspeichern:

_ExampleBAR.bar

Code: Select all

[Buttonbar]
Buttoncount=3
button1=C:\WINDOWS\system32\calc.exe
cmd1=C:\WINDOWS\system32\calc.exe
path1=C:\WINDOWS\system32\
iconic1=0
menu1=Calculator
button2=C:\WINDOWS\system32\notepad.exe
cmd2=C:\WINDOWS\system32\notepad.exe
path2=C:\WINDOWS\system32\
iconic2=0
menu2=Notepad
button3=%Commander_Path%\WCMICONS.DLL
cmd3=%Commander_Path%\default.BAR
iconic3=0
menu3=Zurück zur DEFAULT.bar

Wie man sieht, kann man diese Dateien auch "von Hand" erstellen.


Erklärung:
button1=Pfad zur Datei mit dem Icon
cmd1=Pfad zum Programm
path1=Der Startpfad
iconic1=0 Ausführungsart minimiert / maximiert

Zur Unterscheidung der einzelnen Befehle,
bzw. zur Zusammenfassung zusammengehöriger Parameter,
haben die einzelne Einträge eine Ziffer am Ende:
Alle Parameter zu Befehl Nummer 1 tragen die '1' am Ende usw.


- - -


Einen Button mit einer eigenen Buttonbar als PullDown-Menü einrichten:


Einen vorhandene Button verwenden:

- lege einen neue Buttobar an (siehe oben bei "Eine eigene, bzw. weitere Buttonbar's anlegen")
(Damit das Folgende funktioniert, darf die 'MeineNeueBar.bar' nicht nur den "Zurück"-Button als einzigen Button enthalten?!?,...lege einen zweiten Button an)
-dann-

- Rechte Maustaste auf den Button mit dem 'MeineNeueBar.bar'-Befehl
- Ändern...
- - aktiviere die Option "[x] Als Menü anzeigen"
- - [OK]

Das Icon hat sich jetzt leicht geändert (kleines Dreieck rechts unten)
Ein Klick auf einen solchen Button öffnet die Buttonbar als Pull-Down Menü.
Ein Klick bei gehaltener Umschalttaste öffnet das PullDown-Menü als Buttonbar (hoffentlich hast du dort einen "Zurück"-Button ;-) )



Alternativ eine neuen Button anlegen:

- Rechte Maustaste auf Buttonbar
- Ändern...
- - Kommando [Ändern>>] >> Bar einfügen > > ... eine *.bar auswählen + [Öffnen]
- - "[x] Als Menü anzeigen"
- - [OK]



Allgemein gilt:

- zwecks Übersicht kann man alle *.bar Dateien auch in einem UNterordner ablegen.
Dann muss man den kompletten Pfad zur Datei verwenden, sonst würde auch der Dateiname selbst reichen.

- um portable zu sein, kann man den Pfad zum TC-Ordner als TC-Umgebungsvariable "%Commander_Path%" angeben.


- der TC legt für jede verwendete *bar eine neue Datei *.br2 an.
Diese ist quasi eine vor-kompilierte Version, damit das spätere Laden schneller geht.
Diese *.br2 Dateien können gelöscht werden, sie werden wieder neu erstellt.



Extras:
Kann ich irgendwie die Hintergrundfarbe einer Buttonbar ändern???
http://ghisler.ch/board/viewtopic.php?t=1893



-





 
Last edited by Stefan2 on 2017-12-25, 17:18 UTC, edited 8 times in total.
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Autom: Quotes Quoting Anführungszeichen Leerzeichen

Post by *Stefan2 »

Post 2 - Quoting / Anführungszeichen 


Korrektes Quoting / in Anführungszeichen setzen

Das korrekte Quoting (Argumente zu Befehle in Anführungszeichen setzen) ist überall beim Skripten/Programmieren sehr wichtig.


Wenn man einem Befehl ein Argument übergibt, zB ein Parameter wie einen Dateinamen oder einen Pfad,
dann muss der "Empfänger" erkennen können, wo ein Argument anfängt und wo aufhört.

Der "Empfänger" erkennt das (meistens) an einem Leerzeichen:

Code: Select all

drei Argumente: MeinProgramm.exe  Parameter1 Para meter2
drei Argumente: MeinProgramm.exe  "Parameter1" "Para" "meter2"
zwei Argumente: MeinProgramm.exe  Parameter1 "Para meter2"
zwei Argumente: MeinProgramm.exe  "Parameter1" "Para meter2"
ein Argument: 	MeinProgramm.exe  "Parameter1 Para meter2"


Leider verhalten sich die "Sender" sowie die "Empfänger" der Befehle sehr unterschiedlich, was das Behandeln der Qoutes betrifft.

Auch der TC versucht "smart" zu sein und setzt manche Parameter selbst in Anführungszeichen, aber nur falls der Pfad Leerzeichen enthält.
(das macht er bei %N, bei %P%N, bei %P%S sowie bei %T%M)
Sheepdog wrote: Hier erklärt @ghisler, dass %N und %P%N automatisch von Anführungszeichen umschlossen werden, weil sie meist
als eigenständige Parameter bverwendet werden, während zum Beispiel %O eher zur Bildung anderer Namen Verwendung findet.

sheepdog
ghisler(Author) wrote:%N and %P%N are surrounded automatically by quotation marks,
because they often stand alone as parameters. %O is usually needed to create new names, e.g. %O.bak,
therefore it wouldn't be good to have "" placed automatically around it.
Therefore you have to add the double quotes yourself.
petermad wrote: 2022-04-27, 13:54 UTC Picking up on this thread https://www.ghisler.ch/board/viewtopic.php?p=396234#p396234
- I still see the difference between the command parameters %N and %M
- where %N adds quotation marks when there are spaces in the filename, while %M does not
- it is possible to make the behavior consistent so %M also adds quotation marks?
ghisler(Author) wrote: 2022-04-28, 07:48 UTC You are right, %S and %P%S also automatically adds quotes.
However, I may break a lot of people's buttons when I surrounded all %M with quotes,
e.g. when they have something like %P%M or other unusual combinations. :(




Wenn man nun eigene Befehle erstellt und den Pfad standardmäßig in Anführungszeichen setzt,
setzt der TC alles noch einmal in Anführungszeichen, aber nur, wenn er Leerzeichen eindeckt.
Man muss dann in seinem Skript das Quoting entsprechend bereinigen.


Beispiele:

Verwenden von %P%N ohne eigene Anführungszeichen:

Code: Select all

Anwender Argumente 	==> %P%N ===> der TC gibt weiter
Parameter1 		==> %P%N ===> Parameter1
Para meter2 		==> %P%N ===> "Para meter2"
Verwenden von "%P%N" mit eigenen Anführungszeichen:

Code: Select all

Anwender Argumente 	==> "%P%N" ===> der TC gibt weiter
Parameter1 		==> "%P%N" ===> "Parameter1"
Para meter2 		==> "%P%N" ===> ""Para meter2""


Man kann das ganze Ungewisse auch umgehen, indem man das '%N' durch '%O.%E' ersetzt.
Hierbei versucht der TC nicht von sich aus Anführungszeichen zu setzen.

Verwenden von "%P%O.%E" mit eigenen Anführungszeichen:

Code: Select all

Anwender Argumente 	==> "%P%O.%E" ===> der TC gibt weiter
Parameter1 		==> "%P%O.%E" ===> "Parameter1"
Para meter2 		==> "%P%O.%E" ===> "Para meter2"
Parameter 		==> %P%O.%E ===> Parameter

- - -

Aufruf von Programmen mit eigenen Parametern und ausgewählten Dateien:


Dies hängt oft stark von dem verwendeten Programm ab und muss manchmal
durch 'Versuch-Fehler-Ändern-Versuch' -Tests herausgefunden werden.

Hier ist das Studieren der Hilfe des verwendeten Programms inklusive der Beispiele von Vorteil.
Bei Anfragen hierzu bitte auf die Hilfe des verwendeten Programms im Internet verlinken.


...

......


- - -

Weiterführende Info:

Everyone quotes command line arguments the wrong way – Twisty Little Passages, All Alike

How Command Line Parameters Are Parsed

Everything You Need to Know About a Windows Command Line
- Quoting and Escaping Windows Command Line Arguments
- How a Windows Program Splits Its Command Line Into Arguments


- - -

Eigene Test, welche Parameter und welche Anführungszeichen übergeben werden:


Verschiedene "Interpreter" verarbeiten die übergebenen Parameter auch unterschiedlich.
Zum wirklich korrekten Testen sollte man die Parameterübergabe mit demselben Interpreter testen, welcher auch für das spätere Skript zur Anwendung kommt.




Man kann in jeder Programmiersprache kleine Testprogramme schreiben, um sich die übergebenen Argumente anzuschauen.


Hier ein paar gefundene Code-Beispiele:

Den Code jeweils als Text abspeichern, dann einen Button erstellen. (siehe oben 'Post 1 - Button')
Dateien markieren und Button anklicken, dann werden alle markierten Dateien übergeben.


- - -

Kommando: cmd /k python params.py
Parameter: "%P" "%T"
Startpfad: leer
Icondatei: python
Tooltip:

params.py

Code: Select all

import sys
print(len(sys.argv))
print(sys.argv)
arg1=sys.argv[1]
arg2=sys.argv[2]
for x in range(1, len(sys.argv)):
    print('{}:\t{}'.format(x,sys.argv[x]))
---

Kommando: cmd /k java -jar params.jar
Parameter: "%P" "%T"

<wo habe ich denn den Code gelassen, ... muss ich mal suchen gehen....>


---

Kommando: ParameterPresenter.vbs
Parameter: "%P" "%T"
Startpfad: leer
Icondatei: wscript
Tooltip:

ParameterPresenter.vbs

Code: Select all

For i = 0 to WScript.Arguments.Count -1
 vArgs = vArgs & chr(34) & WScript.Arguments.Item(i) & chr(34) & " "
 vMsg = vMsg & "Arg " & i+1 & " _" & WScript.Arguments.Item(i) & "_" & vbCRLF
Next 
MsgBox vArgs & vbLF & vbLF & WScript.Arguments.Count & " Argumente:" & vbLF & vMsg
---

Kommando: PowerShell -NoProfile -NoExit -ExecutionPolicy Bypass -file params.ps1
Parameter: '%P' '%T'
Parameter: """%P""" """%T"""
( Verwende drei doppelte Anführungszeichen """...""" ; oder einfache Anführungszeichen '...' )
Startpfad: leer
Icondatei: powershell
Tooltip:

params1.ps1

Code: Select all

Write-Host "$($Args.count) Argumente:"; for ( $i=0; $i -lt $Args.count; $i++ ) {"Arg $($i+1) _" + $Args[$i] + "_" }
params2-Spezial.ps1

Code: Select all

function get-args {Param([string]$command) [management.automation.psparser]::Tokenize($command,[ref]$null)}
for ( $i = 0; $i -lt $Args.count; $i++ ) { get-args $Args[$i] }
Von den PowerShell Community Extensions (PSCX) gibt es auch eine EchoArgs.exe
'Uwe' schrieb: schau mal hier rein: http://edgylogic.com/blog/powershell-and-external-commands-done-right/
(NEU: https://slai.github.io/posts/powershell-and-external-commands-done-right/)
Da bekommst du eine echoargs.exe mit der du dir anzeigen lassen kannst wie die Parameter an deine Anwendung tatsächlich übergeben werden.
Und noch mehr Infos zum Ausführen von externen Befehlen.


---

Kommando: ParameterPresenter.cmd
Parameter: "%P" "%T"
Startpfad: leer
Icondatei: cmd
Tooltip:

-oder-
Kommando: ParameterPresenter.cmd
Parameter: %S
(ein paar Dateien markieren, dann den Button drücken)


ParameterPresenter.cmd

Code: Select all

@ECHO OFF
SET Counter=1
SetLocal enableDelayedExpansion
ECHO Aufruf:
ECHO %0
ECHO %*
ECHO.
ECHO Argumente:
FOR %%A IN (%*) DO (ECHO Arg !Counter! _%%A_ & SET /A Counter=Counter+1)
ECHO.
ECHO Fertig.
PAUSE
- - -

Eine weitere, etwas erweiterte Parameter.cmd

Code: Select all

@ECHO OFF
ECHO TC-Ordner: %Commander_Path%
ECHO Aufruf-Befehlszeile:
ECHO %0 %*
ECHO %0 %*> "%TEMP%\zz170309tempfile.txt"
FOR %%? IN ("%TEMP%\zz170309tempfile.txt") DO ( SET /A zz170309Strlength=%%~z? - 2 )
ECHO Laenge der Befehlszeile: %zz170309Strlength%
ECHO ACHTUNG: Maximale Laenge ist 32.767 Zeichen.
DEL "%TEMP%\zz170309tempfile.txt"
ECHO.
ECHO.
ECHO Parameter:
SET I=1& SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%A IN (%*) DO (ECHO !I!: _%%A_  && SET /A I=I+1)
ECHO.
ECHO.
ECHO Fertig
PAUSE
http://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file


- - -

ShowArgs.exe
C-Source

Code: Select all

#include <stdio.h>
int main(int argc, char *argv[])
{
   int x = 0;
   for (x = 0; x < argc; x++)
   {
      printf("%d: %s\n", x+1, argv[x]);
   }
   printf("\nPress any key to continue...\n");
   getchar();
   return 0;
}


- - -

Weitere Tools:


TextTools - Support Utilities
Revised 21-Oct-00. Copyright © 1996-2000 by Rune Berg. TextTools Freeware.

ttargs
This program may help if your shell or command interpreter plays tricks on your
quoting or special characters when typing a command.
It simply prints the command and its arguments as delivered to a program. For example:






Unterschied zwischen Win9x und WinNT(win2000;XP;Vista;win7;win8;win10)

viewtopic.php?f=32&t=54452&p=366844#p366844
NOCLOSE.EXE Win9x CRITICAL bug
Isica wrote: 2019-10-29, 17:19 UTC by *Isica » Tue Oct 29, 2019 18:19
NOCLOSE.EXE twice quoted the command line, and command.com does' nt understand it.
---
by *MaxX » Thu Nov 28, 2019 14:15
Hm. I use "cmd.exe /K <command-line>" and have no problems.
Why should we still use noclose.exe? Is there any reason to use it?

by *ghisler(Author) » Fri Nov 29, 2019 16:51
The idea was that people could replace it with their own command handler for Shift+Enter.
Noclose.exe is a drop in replacement for noclose.pif, which prevented command.com from closing.
You are right that it's not really necessary any more.
---


by *MVV » Tue Nov 05, 2019 7:47
AFAIK, command line after /K must not be double-quoted for Win9x, it is only a WinNT stupid cmd.exe's requirement.
So you should just append command line to command.com /K for Win9x and at the same time you should append double-quoted command line to cmd.exe /K.
And, there are still conditions that blind double-quoting for WinNT may cause fails.

But here I think that "dir" in TC command line should produce same results like in cmd.exe command line,
so it is quite expected that quoted interpreter command name fails - it must not be quoted.

Things are complicated with cmd.exe.
It assumes that the passed command line is double-quoted in some cases and removes "outer" quotes,
so if you aren't aware of its stupid syntax, you may get errors.
E.g. try executing following command line:
cmd.exe /k "%COMMANDER_EXE%" /n /i="%COMMANDER_INI%"

You will get an error because cmd.exe cuts first and last quote and gets incorrect command line.
So in this case you have to add outer quotes to passed command line.
cmd.exe /k " "%COMMANDER_EXE%" /n /i="%COMMANDER_INI%" "

PS. You can execute cmd.exe /? to read about its quoting rules.




Post by *Isica » Sat Nov 09, 2019 2:42
Yes, you are right, I missed this moment.
Then do it right:
command.com /K <command-line>
cmd.exe /S /K "<command-line>"
That is, for cmd, you need to stupidly enclose the command line in quotation marks, and that’s it.
But you should NOT go into the meaning of the command line and try to correct it.




by *ghisler(Author) » Mon Dec 30, 2019 9:12
Could someone test this please? It should be fixed since beta 9:
11.12.19 Fixed: NOCLOSE.EXE: Do not quote command after /K when using command.com (32)
TC should call command.com without quotes on Win9x/ME, the behaviour on Windows NT based system is unchanged.



/Unterschied zwischen Win9x und WinNT





 
Last edited by Stefan2 on 2017-12-21, 20:08 UTC, edited 8 times in total.
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Autom: Aktion für ausgewählte Dateien/Ordner ausführen

Post by *Stefan2 »

Post 3 - Aktionen für ausgewählte Dateien


Aktion für ausgewählte Dateien/Ordner ausführen


Um ein externes Programm mit allen ausgewählten Dateien als Argument aufzurufen,
bietet der TC einige Parameter zur Übergabe dieser Argumente an:

Siehe Hilfe ( rechter Mausklick auf einen Button > Ändern... > F1-Taste drücken > lesen (und Button-Dialog wieder [Abbrechen]) )
Oder suche in der Hilfe nach "Dialogbox: Konfigurieren - Buttonbar ändern"


Kleiner Auszug aus der Parameterliste:

Code: Select all


? (Ein 'Fragezeichen' als ERSTER Parameter) = zeigt den Befehl vor der Ausführung nochmal zwecks Überprüfung an.

%P - Pfad des Quellverzeichnisses (inkl. \ am Ende).
%N - der aktuelle Dateiname (umgeben von einer gestrichelten Box).
%P%N Pfad und der aktuelle Dateiname.

%T - der aktuelle Zielpfad.
%M - den im Zielverzeichnis gewählten Dateinamen.
%T%M Zielpfad und Dateinamen.


%S - die Namen aller markierten Dateien.  --- (Auch möglich:  %S2, %S3, u.s.w.)
%P%S fügt alle langen Dateinamen inkl. langen Pfads ein


%O der aktuelle Dateinamen ohne Erweiterung (BaseName) 
%E die aktuelle Dateierweiterung (ohne Punkt) 


Liste aller ausgewählter Dateien:
"%L" Lange Dateinamen inkl. kompletten Pfads, z. B. c:\Eigene Dateien\langer Name.txt 
"%F" Lange Dateinamen ohne Pfad, z. B. langer Name.txt 
"%UL", "%UF" wie %L und %F, aber mit UTF-8-Unicode-Listendatei (mit Byteordermarker)
"%WL", "%WF" wie %L und %F, aber mit UTF-16-Unicode-Listendatei (mit Byteordermarker)

Diese letzten Parameter (%L ... %WF) erstellen eine temporäre Datei im TEMP-Ordner des Anwenders:
"C:\Users\My User Name\AppData\Local\Temp\[b]CMDB034.tmp[/b]"
Falls Leerzeichen im Pfad sind (zB im Username), oder gerne auch immer, die Listen-Parameter in Anführungszeichen setzen: "%L"




ACHTUNG: Groß-Kleinschreibweise ist WICHTIG. Kleingeschriebene Parameter verhalten sich anders als großgeschriebene!
Siehe die Hilfe für weitere Informationen und eine Liste aller Parameter.






TC Automatisches Quoting, und was der Empfänger daraus macht:

Code: Select all


-- (0) => Kein automatisches Quoting der Pfade/Dateinamen-Ausgabe bei Leerzeichen
-- (1) => .... Automatisches Quoting der Pfade/Dateinamen-Ausgabe bei Leerzeichen.
-- (2) => .... automatisches Quoting der Pfade/Dateinamen-Ausgabe bei Leerzeichen aber der Interpreter entfernt diese.
(Teste mit '?' (Ein 'Fragezeichen' als ERSTER Parameter) um zu sehen was der TC weitergibt)


%P - (CMD/Batch: 0)(WScript/VBS: 0)(PoSh: 0)
%N - (CMD/Batch: 1)(WScript/VBS: 2)(PoSh: 2)
%P%N (CMD/Batch: 1)(WScript/VBS: 2)(PoSh: 2)

%T - der aktuelle Zielpfad. (0)
%M - den im Zielverzeichnis gewählten Dateinamen. (0)
%T%M Zielpfad und Dateinamen. (CMD/Batch: 1)(WScript/VBS: 2)(PoSh: 2)

%S - die Namen aller markierten Dateien. CMD/Batch: 1)(WScript/VBS: 2 und benötigt 'WScript' als Kommando)(PoSh: 2)
%P%S fügt alle langen Dateinamen inkl. langen Pfads ein (CMD/Batch: 1)(WScript/VBS: 2)(PoSh: 2)

%O der aktuelle Dateinamen ohne Erweiterung (BaseName) (0)
%E die aktuelle Dateierweiterung (ohne Punkt) (0)

Die Listenparameter wie "%L" u.a. selbst sollten in Anführungszeichen gesetzt werden.
Die Einträge in der erstellten Dateiliste haben dann keine Anführungszeichen, auch nicht bei Leerzeichen.


Kleine Endscheidungshilfe:

Mit %P; %N; %PN; %T; %M; %TM; %O; und %E kann man prima mit einzelnen Dateien arbeiten.

Mit %S und %P%S kann man einem Programm oder Skript alle ausgewählte Dateinamen übergeben.

Mit %L und %F usw. bekommt man eine Liste (Textdatei) welche man bei manchen Programmen als Parameter übergeben,
oder mittels eines Skriptes Zeile-für-Zeile (Datei-für-Datei) selbst abarbeiten kann.

Im Zweifelsfall sollte man ein eigenes Skript aufrufen und diesem den TC-Parameter "%L" übergeben.
In diesem Skript kann man dann alles Gewünschtes selbst erledigen.



ACHTUNG: Groß-Kleinschreibweise ist WICHTIG. Siehe die Hilfe, kleingeschriebene Parameter verhalten sich anders als großgeschriebene!



Ein Programm mit einer ausgewählten Datei öffnen:
Kommando: "L:\aufwerk\Pfad zu\Programm\Application.exe"
Parameter: %P%N
Startpfad: >>>Nur wenn das Programm dies benötigt: "L:\aufwerk\Pfad zu\Programm" (Ansonsten leer lassen)<<<
Icondatei: "L:\aufwerk\Pfad zu\Programm\Application.exe"
Icon: <auswählen>
Tooltip: Hier eine kurze Beschreibung|Hier ein Zeilenumbruch.
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(%P%N ...ohne Anführungszeichen! Großschreiben ist wichtig, siehe die Hilfe!)

Ergebnis: "L:\aufwerk\Pfad zu\Programm\Application.exe" C:\Temp\Test.txt
-oder- (Quoting, je nachdem ob Leerzeichen oder nicht)
Ergebnis: "L:\aufwerk\Pfad zu\Programm\Application.exe" "C:\Temp\Zweite Test.txt"



Ein Programm mit ZWEI ausgewählten Datei (je Eine linkes und rechtes Fenster) öffnen:
Kommando: "L:\aufwerk\Pfad zu\Programm\DiffTool.exe"
Parameter: %P%N %T%M
Startpfad: >>>Nur wenn das Programm dies benötigt: "L:\aufwerk\Pfad zu\Programm" (Ansonsten leer lassen)<<<
Icondatei: "L:\aufwerk\Pfad zu\Programm\DiffTool.exe"
Icon:
Tooltip: Öffne DIFF mit Dateien|vom linken und rechten Panel.
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(%P%N %T%M ...ohne Anführungszeichen! Großschreiben ist wichtig, siehe die Hilfe!
Bei Bedarf kann man auch die Parameter %T%M %P%N anders anordnen.)

Ergebnis: "L:\aufwerk\Pfad zu\Programm\DiffTool.exe" C:\Temp\Test.txt "X:\Beispiel\Zweite Datei.txt"
Hierbei werden die Datei unter dem Cursor im Quellfenster und die Datei unter dem Cursor im Zielfenster verglichen.

Zur Übergabe nur der Pfade selbst, verwende: "%P" "%T" .....Ja, diesmal mit Anführungszeichen.


Ein Programm mit ZWEI (im selben Fenster) ausgewählten Datei öffnen:
Zur Verarbeitung von zwei Dateien im selben Fenster, verwende %P%S2
(...ohne Anführungszeichen! Großschreiben ist wichtig, siehe die Hilfe!)



ZWEI ausgewählten Dateien zum Vergleichen öffnen:
Des Weiteren gibt es noch %C1 / %C2:
19.01.16 Total Commander 9.0 beta 1 > Added: Button bar, start menu parameters
%C1, %C2: Vergleich-Parameter wie bei "Vergleiche nach Inhalt":
Erste beide ausgewählte (oder unter Cursor) Dateien (mit vollen Pfad)
-oder-
im aktiven und inaktiven Fenster ausgewählte Dateien
-oder-
Datei im aktiven und Datei mit gleichem Namen im inaktiven Fenster.
Hinweis: Ist das rechte Fenster das Aktive und weniger wie 2 Dateien sind ausgewählt, dann arbeiten %C1 und %C2 vertauscht.


Ein Programm mit einer oder mehreren ausgewählten Dateien öffnen:
Kommando: "L:\aufwerk\Pfad zu\Programm\Application.exe"
Parameter: %P%S
Startpfad: >>>Nur wenn das Programm dies benötigt: "L:\aufwerk\Pfad zu\Programm" (Ansonsten leer lassen)<<<
Icondatei: "L:\aufwerk\Pfad zu\Programm\Application.exe"
Icon: <auswählen>
Tooltip: Hier eine kurze Beschreibung|Hier ein Zeilenumbruch.
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

Ergebnis: "L:\aufwerk\Pfad zu\Programm\Application.exe" "C:\Temp\Abc Test.txt" C:\Temp\Def.txt "C:\Temp\Ghi Jkl MNO.txt"



Ein Programm mit einer oder mehreren ausgewählten Dateien als übergebene Listendatei öffnen:
Kommando: "%Commander_Path%\TOOLs\Packer\7za.exe"
Parameter: a -tzip "archive.zip" @"%L"
Startpfad:
Icondatei: "%Commander_Path%\TOOLs\Packer\7za.exe"
Icon:
Tooltip: Execute '7z a -tzip archive.zip @listfile.txt'
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

Ergebnis: "%Commander_Path%\TOOLs\Packer\7za.exe" a -tzip "archive.zip" @"C:\Users\My User Name\AppData\Local\Temp\CMDB034.tmp"



Ein Programm für jede ausgewählte Datei öffnen:
Kommando: "L:\aufwerk\Pfad zu\MeineTools\Skript.vbs"
Parameter: "%L"
Startpfad:
Icondatei: "%Commander_Path%\WCMICONS.DLL"
Icon: <auswählen>
Tooltip: Eigenes Skript bearbeite die "%L"-Datei Zeile-für-Zeile.
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

Ergebnis: "L:\aufwerk\Pfad zu\MeineTools\Skript.vbs" "C:\Users\My User Name\AppData\Local\Temp\CMDA987.tmp"

In der 'Skript.vbs'
- öffne 'CMDA987.tmp'
-- für jede Zeile (Pfad\Datei)
--- mache etwas, zB Starte "L:\aufwerk\Pfad zu\Programm\Application.exe" mit aktueller Datei


Beispielskripte sowie externe Tools findest du weiter unten...


ACHTUNG: Groß-Kleinschreibweise ist WICHTIG. Siehe die Hilfe, kleingeschriebene Parameter verhalten sich anders als großgeschriebene!



Tipp:
Beachte auch das korrekte Quoting (Siehe den Abschnitt "Quoting").
Pfade und Dateinamen sollten eigentlich immer in Anführungszeichen gesetzt werden.
TC-Parameter nur manchmal, siehe oben.
Wenn das verwendete externe Programm noch eigene Parameter benötigt, hilft oft nur ausprobieren, schau dir dessen Hilfe an.




Parameter austesten:

Um die einzelnen Parameter zu testen verwende die "Eigene Test"-Skripte im obigen Post "Post 2 - Quoting"
Es ist wichtig mit dem selben Interpreter / Skriptsprache zu testen, mit der man auch das eigentliche Skript schreiben möchte!





Beispielsanwendungen der TC-Parameter mit verschiedenen Skriptsprachen


Beispiel Batch für EINE ausgewählte Datei:

Kommando: "L:\aufwerk\Pfad zu\Test.CMD"
Parameter: %P%N
Startpfad:
Icondatei: cmd.exe
Icon:
Tooltip: Dieser Button macht...|dies und|das
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, die %P%N NICHT in Anführungszeichen setzen! Aber das DOS-Kommando '%~1' entfernt diese sowieso.)


Beachte das man die Skripte im TC-Ordner bzw. einem Unterordner speichern und dann mit relativen Pfaden portable aufrufen kann.
(siehe http://www.ghisler.ch/wikide/index.php/Navigation)
Kommando: "%Commander_Path%\MeineTools\Test.CMD"
Parameter: %P%N



Test.CMD

Code: Select all

@ECHO OFF 
ECHO Processing (Quotes original) %1
ECHO Processing (Quotes entfernt) %~1
ECHO Drive: %~d1
ECHO PATH:  %~dp1
ECHO NAME:  %~nx1
ECHO BASE:  %~n1
ECHO EXTe:  %~x1
REM -------------
SET  myEXT=%~x1
SET  myEXT=%myEXT:.=%
ECHO myEXT:  %myEXT%
REM -------------
ECHO.
ECHO Fertig!
PAUSE

Anleitung:
- Erstelle eine leere Textdatei
- kopiere den obigen Code hinein
- speichere als TEST.CMD
- drag&drop auf TC Buttonbar
- rechter Mausklick auf den Button > Ändern...
- Parameter %P%N eintragen
- Startpfad-Feld leeren
- [OK]


Anwendung:
- Cursor auf eine Datei (am Besten mit Leerzeichen) setzen, Button anklicken.
- eine DOS-Box erscheint und zeigt die das Ergebnis an.


- - -

Beispiel Batch für EINE ausgewählte Datei und mit zwei Parameter:


Kommando: "L:\aufwerk\Pfad zu\batch.cmd"
Parameter: "%L" "%Parchive.zip"
("%P" liefert den aktuellen Pfad inklusive Backslash am Ende: C:\Temp\Test\)
Startpfad:
Icondatei: cmd.exe
Icon:
Tooltip: Eigenes Skript bearbeite die "%L"-Datei Zeile-für-Zeile.
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen.)


batch.cmd:

Code: Select all

@ECHO OFF
SET listfiletxt=%~1
SET newARCH=%~2
%Commander_Path%\TOOLs\Packer\7za.exe a "%newARCH%" @"%listfiletxt%"

Erklärung:

"%L" erzeugt eine temporäre Datei mit der Liste der ausgewählten Dateien, ("C:\Users\my user name\AppData\Local\Temp\CMDB034.tmp")
welche als erstes Argument an die Batch übergeben, und dort als Parameter %1 empfangen wird.

Der Befehl %~1 anstelle von %1 hat den Grund, dass dieses die äußeren Anführungszeichen entfernt, falls welche vorhanden sind.
Wir können diese Anführungszeichen dann selbst setzen, ohne dass wir am Ende diese doppelt haben.

Als zweiter Parameter "%Parchive.zip" wird der gewünschte Name des zu erstellenden Archivs inklusive Pfad übergeben.
Der TC-Parameter "%P" liefert den aktuellen Pfad inklusive Backslash am Ende: "C:\Temp\Test\"
Das "archive.zip" ist der Name des Archiv, komplett also: "C:\Temp\Test\archive.zip"



- - -


Beispiel für eine oder mehrere ausgewählte Dateien:


Den %L -Parameter verwendet man, falls das externe Programm ein Liste mit einer Datei pro Zeile abarbeiten kann.

Kommando: "L:\aufwerk\Pfad zu\Programm\Prog.exe"
Parameter: "%L"
Startpfad:
Icondatei: "L:\aufwerk\Pfad zu\Programm\Prog.exe"

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen.)



Damit erstellt der TC im Temp-Ordner des Benutzers eine temporäre Datei mit allen ausgewählten Dateien, eine pro Zeile.
"C:\Users\My User Name\AppData\Local\Temp\CMDB034.tmp"

Siehe die Hilfe:
%L %WL %UL > c:\Eigene Dateien\langer Name.txt
%F %WF %UF > langer Name.txt


- - -


Beispiel Batch für eine oder MEHRERE ausgewählte Dateien:

Kommando: "L:\aufwerk\Pfad zu\Test.CMD"
Parameter: "%L"
Startpfad:
Icondatei: cmd.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen.)

Code: Select all

@ECHO OFF 
Setlocal EnableDelayedExpansion
REM Batch script "For_Each_Selected_File_Do.cmd" by Stefan, 2017-07-24, v0.01
REM
REM Use from a Total Commander Button:
REM Command:   "path\to\this\batch.cmd"
REM Parameter: "%L"   (see TC help for more)
REM
REM Usage: select a few files and execute the button.
REM
REM
REM THE CODE
ECHO Found TC's %%L-temp file: %1
ECHO Start reading  the temp file... and do something for each file:
ECHO ******************************************
for /f "delims=" %%L in ('type %1') do (
    REM For Each Line (=File) in temp file DO:
    REM (modify this part for your task)
    ECHO Processing "%%L"
    ECHO Drive: %%~dL
    ECHO PATH: %%~dpL
    ECHO NAME: %%~nxL
    ECHO BASE: %%~nL
    ECHO EXTe: %%~xL
    ECHO File %%~nxL done. Go to next...
    PAUSE
ECHO ******************************************
)
ECHO.
ECHO All Done!
PAUSE

- - -

Beispiel Batch für eine oder MEHRERE ausgewählte Dateien und drei Parametern:

Kommando: "L:\aufwerk\Pfad zu\Test.CMD"
Parameter: "%L" "C:\TEMP" "X:\test"
Startpfad:
Icondatei: cmd.exe
Icon:
Tooltip: Dieser Button macht...|dies und|das
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben beschrieben, am Besten die TC-Parameter vorsichtshalber in Anführungszeichen setzen)

Code: Select all

@echo off
REM batch crafted by our user MVV
setlocal enabledelayedexpansion
rem Button Parameter "%F" "%P" "%T"
set tc_lst=%1
set tc_src=%2
set tc_dst=%3

echo %tc_lst%
echo %tc_src%
echo %tc_dst%

if -%3==- echo First parameter must be filelist path, second and third - source and target path. && pause && goto :EOF
for /F "usebackq delims=" %%I in (%tc_lst%) do (
   echo Exp:       %%~I
   echo Full Path:   %%~fI
   echo LW:      %%~dI
   echo Path:      %%~pI
   echo File Name:   %%~nI
   echo Extension:   %%~xI
   echo ShortPath:   %%~sI
   echo Attrb:      %%~aI
   echo Date Time:   %%~tI
   echo Size:      %%~zI
   echo ----------------------------
   set concat=!concat! %%~nI
)
echo %concat%
echo !concat!
pause
cls
endlocal

- - -

Noch zwei Batch von MVV
http://ghisler.ch/board/viewtopic.php?t=36880


Für %P%S

Code: Select all

@echo off
rem Abarbeitung von %P%S
:loop_next
  if -%1==- goto loop_end
  echo Mache etwas mit "%~1"
  shift
  goto loop_next
:loop_end
pause
Für %L oder %F

Code: Select all

@echo off
rem Abarbeitung von %L oder %WL
for /f "usebackq delims=" %%s in (`type %1`) do echo Mache etwas mit  "%%s"
pause

- - -

Beispiel Batch für eine oder MEHRERE ausgewählte Dateien,
welche hier komplett im TC-Button erstellt wird (ohne extra externe Datei):


Kommando: cmd.exe /c
Parameter: FOR /F "delims=" %%O in ('TYPE "%F"') DO md "%T%%O"
Startpfad:
Icondatei: cmd.exe (oder %Commander_Path%\WCMICONS.DLL)
Icon:
Tooltip: Erstelle ausgewählte Ordner auch im Target-Panel
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben beschrieben, am Besten die TC-Parameter vorsichtshalber in Anführungszeichen setzen)



Button-Code zum Kopieren und einfügen:

Code: Select all


TOTALCMD#BAR#DATA
cmd /c
for /f "delims=" %%O in ('TYPE "%F"') do md "%T%%O"
cmd
Erstelle ausgewählte Ordner im Target-Panel


-1

Erklärung zu TOTALCMD#BAR#DATA (Klick)




Erklärungen:


Der MS-DOS Batch-Befehl ist hier FOR /F "delims=" %%O in ( '...' ) DO .... etwas mit %%O


%%O ist der Name meiner Variable in der Batch.
Man kann hier %A, %B,...bis %Z verwenden (keine Unterscheidung zwischen Groß/Kleinschreibung)
In einer Batch wird das Prozentzeichen bei der DOS-Variable verdoppelt,
{anders als in der Eingabeaufforderung/DOS-Box selbst, hier reicht ein einfaches '%'}
weil der Batch-Interpreter immer ein '%' entfernt.
(((Verdopplung von '%' NUR bei den DOS-Variablen Namen, NICHT bei den TC-Parameter!)))


TC stellt zum Abarbeiten der ausgewählten Dateien/Ordner eigene Parameter bereit,
zB "%F" und "%T" (drücke F1 im offenen Buttondialog für die Hilfe)

"%F" erstellt eine temporäre Datei mit den ausgewählten Dateien/Ordner, jeweils eine pro Zeile.
Mittels ' TYPE "%F" ' wird diese temporäre Datei Zeile für Zeile abgearbeitet,
wobei die aktuelle Zeile in der angegebenen Variablen (hier %O) festgehalten wird.

Zum Schluss wird hinter DO ein weiterer DOS-Befehl aufgerufen: MD "%T%%O"
Also: erstelle einen Ordner (MD) im Target (%T) Namens (%O)

Hilfe zu den DOS-Befehlen erhält man in der Eingabeaufforderung/DOS-Box selbst:
CMD /?
FOR /?
MD /?
IF /?


Eine Übersicht aller Befehle erhält man dort mit HELP


Info zu eol, skip, delims, tokens und usebackq zeigt die FOR Hilfe.
delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen die Standardtrennzeichen TAB und Leerzeichen.
tokens=x,y,m-n - Gibt an, welche Token von jeder Zeile an die FOR-Schleife weitergegeben werden.
usw.


Ebenfalls in der FOR Hilfe findet man Erklärungen zu den Batch-Variablen,
wie hier zB zu %O (in der Hilfe wird ein %I als Beispielvariablennamen verwendet):
%~I - Expandiert %I und entfernt alle umschließenden Anführungszeichen (").
%~fI - Expandiert %I zu einem vollständigen Dateinamen.
%~dI - erstellt nur den Laufwerkbuchstaben von %I.
%~pI - erstellt nur den Pfad von %I.
%~nI - erstellt nur den Dateinamen von %I.
%~xI - erstellt nur die Dateierweiterung von %I.
usw.



- - -




Beispiel Batch für eine oder MEHRERE ausgewählte Dateien, um im anderen Panel Dateien mit gleichem Namen zu erstellen:


Zuerst ein gefährliches Beispiel (bitte nicht verwenden)

ACHTUNG, Gefährlich, überschreibt vorhandene Dateien, bitte zuerst komplett durchlesen
Kopieren und als Button einfügen:

Code: Select all

TOTALCMD#BAR#DATA
%comspec%
/k for /f "delims=" %%i in (%F) do type nul >"%T%%i"
%comspec%



-1
Erzeugt im Zielfenster gleichnamige Dateien ohne Inhalt.
Vorhandene Dateien werden ohne Nachfrage überschrieben.

Das "/k" gegen "/c" tauschen, falls das Fenster geschlossen werden soll und zusätzlich "Als Symbol" aktivieren.
Erklärung:

Dieser DOS-Befehl type nul >"%T%%i" erstellt im Zielordner eine neue Datei mit Namen aus der %i Variable.
Allerdings wird hierbei eine vorhandene Datei gleichen Namens ohne Nachfrage überschrieben!!!

Ende des 'gefährlichen' Beispiels, jetzt kommen Lösungsvorschläge...

...


Fehler vermeiden, Befehl vor der Ausführung nochmal anzeigen

Wenn man solche gefährliche Buttons trotzdem verwenden möchte,
kann man sich selbst vor der Gefahr schützen, in dem man einen Warnhinweis hinzufügt:


1.) führendes '?', welches den Befehl vor der Ausführung noch einmal anzeigt.
2.) Text wie zB 'ACHTUNG', welchen man vor der Ausführung entfernen muss.
3.) Aussagekräftiger Tooltip.

Code: Select all

TOTALCMD#BAR#DATA
cmd /k
?ACHTUNG for /f "delims=" %%i in (%F) do type nul >"%T%%i"
cmd
ACHTUNG: überschreibt existierende Dateien!!!|Erstellt leere Dateien im Target aus ausgewählten Dateien.


-1

Bei Ausführung dieses Buttons wird der Befehl zuerst in einem Dialog angezeigt (wegen des Fragezeichens an erster Stelle)
Der DOS-Interpreter kann dann aber mit dem "Befehl" ACHTUNG nichts anfangen und führt den Befehl nicht aus.
Um den Befehl ausführen zulassen, muss man zuerst dieses Wort beim Anzeigen des Befehls (wegen '?') entfernen.

Somit hat man sich einen Sicherheitshinweis gebastelt.

...


Zudem kann man den Befehl selbst entschärfen:
- ............ DO IF NOT exist "%T%%i" type nul >"%T%%i"

Code: Select all

TOTALCMD#BAR#DATA
cmd /k
for /f "delims=" %%i in (%F) do IF NOT exist "%T%%i" type nul >"%T%%i"
cmd
Erstellt leere Dateien im Target,|falls nicht bereits vorhanden.


-1
...


Wie oben beschrieben, am Besten auch die TC-Parameter vorsichtshalber in Anführungszeichen setzen.
Also:
Parameter: for /f "delims=" %%i in ("%F") do type nul >"%T%%i"
Dann funktioniert aber wiederum der Befehl ("%F") nicht mehr,
hier muss man dann bei Anführungszeichen stattdessen das Konstrukt ( ' type "%F" ' ) verwenden:
for /f "delims=" %%i in (' TYPE "%F" ') do IF NOT exist "%T%%i" type nul >"%T%%i"




- - -



Basic-VBScript für eine oder MEHRERE ausgewählte Dateien:

Kommando: "L:\aufwerk\Pfad zu\Test.VBS"
Parameter: "%L"
Startpfad:
Icondatei: wscript.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen. Ebenso den Pfad zur VBS)

Code: Select all

Set oTextStream = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0), 1)
Do Until oTextStream.AtEndOfStream
    vCurrentLine = oTextStream.ReadLine
    MsgBox "Mache etwas mit " & vCurrentLine
Loop
oTextStream.Close

- - -


Basic-VBScript für eine oder MEHRERE ausgewählte Dateien mit möglichen Befehlen:

Kommando: "L:\aufwerk\Pfad zu\Test.VBS"
Parameter: "%L"
Startpfad:
Icondatei: wscript.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen. Ebenso den Pfad zur VBS)

Code: Select all

'Kommando: "L:\aufwerk\Pfad zu diesem\Skript.vbs"
'Parameter: "%L"


Set WSO        = CreateObject("WScript.Shell")
Set FSO        = CreateObject("Scripting.FileSystemObject")

'ScriptPath     = FSO.GetParentFolderName(WScript.ScriptFullName)
'TCPath         = WSO.ExpandEnvironmentStrings("%Commander_Path%")
'PrgFiles       = WSO.ExpandEnvironmentStrings("%ProgramFiles%")
'PrgFiles86     = WSO.ExpandEnvironmentStrings("%ProgramFiles(x86)%")
'PrgFilesCommon = WSO.ExpandEnvironmentStrings("%CommonProgramFiles%")
'UserTEMP       = WSO.ExpandEnvironmentStrings("%tmp%") 



vTCTempList = WScript.Arguments(0) ' The TC temp file due to the "%L" parameter
Set oTextStream = FSO.OpenTextFile(vTCTempList,1)
Do Until oTextStream.AtEndOfStream
        vCurrentLine = oTextStream.ReadLine
        MsgBox "Mache etwas mit " & vCurrentLine


        'IB = InputBox(prompt[, title][, default] ,Xpos,Ypos,HelpFile location, Context in the help file) 
        '  If (IB = "") Then CANCEL pressed ELSE OK or ENTER pressed, 'IsEmpty (returns True when VAR has been declared but not initialized), 
        '//INFO:   IsNull (if the expression is Null), IsNumeric (if the expression is a number)

        'MB = MsgBox(prompt[, buttons 1vbOKCancel 3vbYesNoCancel vbDefaultButton1 vbQuestion vb-Modal][, title]) 
        ' If (MB = vbCancel) Then WScript.Quit 
        '//INFO:  MsgBox Return Values: VBOK 1 / VBCancel 2 / VBAbort 3 / VBRetry 4 / VBIgnore 5 / VBYes 6 / VBNo 7
        '//INFO:  MsgBox Button Constants: VBOKOnly 0 / VBOKCancel 1 / VBAbortRetryIgnore 2 / VBYesNoCancel 3 / VBYesNo 4 / VBRetryCancel 5
        '//INFO:    VBCritical 16 / VBQuestion 32 / VBExclamation 48 / VBInformation 64 / VBDefaultButton1 0 / vbDeBu2=256 / vbDeBu3=512 / vbDeBu4=768
        '//INFO:    VBApplicationModal 0 respond before allowing continue / VBSystemModal 4096 Causes suspension of ALL applications 


        'FSO.CopyFile source, destination[, overwrite]
        'FSO.MoveFile source, destination
        '	RenameFile => FSO.MoveFolder source, destination
        'FSO.CopyFolder source, destination[, overwrite]
        'FSO.MoveFolder source, destination   '(funktioniert nur innerhalb eines Laufwerks!)
        '	RenameFolder => FSO.MoveFolder source, destination


        'WSO.Arguments	  set args = WSO.Arguments	 //	 IF args.count > 0 Then Para1=args(0)
        'WSO.Run strCommand [,intWindowStyle 0=Hide 1=Activate 2=mini 3=maxi ...] [,bWaitTillFinish? True/False]
        'WSO.Run( "regedit /s C:\Temp\temp.reg" , 0, TRUE)
        'WSO.Run "%comspec% /c e: & cd logs & dir >guylogs.txt " & " & notepad guylogs.txt"


Loop
oTextStream.Close

- - -


Erweitertes Beispiel-VBScript für eine oder MEHRERE ausgewählte Dateien:

Kommando: "L:\aufwerk\Pfad zu\Test.VBS"
Parameter: "%L"
Startpfad:
Icondatei: wscript.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen. Ebenso den Pfad zur VBS)

Code: Select all


'Kommando: "L:\aufwerk\Pfad zu diesem\Skript.vbs"
'Parameter: "%L"


Set FSO  = CreateObject("Scripting.FileSystemObject") 
Set WSO  = CreateObject("WScript.Shell")
'//------------------------------------------------------------------------
IF WScript.Arguments.count > 0 Then
    vTCTempList = WScript.Arguments(0) ' The TC temp file due to the "%L" parameter
    'WSO.run "notepad " & sTCTempList
Else
    MsgBox "Nichts markiert oder TC-Parameter fehlt!",,"TC-VBScript"
    WScript.Quit
End If
IF WScript.Arguments.count > 1 Then vTCTargetPath  = Wscript.arguments.Item(1)   ' The Target panel due to the "%T" parameter
'//------------------------------------------------------------------------
'//Lese die mit "%L" generierte Liste Zeile für Zeile aus...
Set oTextStream = FSO.OpenTextFile(vTCTempList,1) 
Do Until oTextStream.AtEndOfStream
    vCurrentLine = oTextStream.ReadLine
    'MBR = MsgBox( vCurrentLine,1,"Debug vCurrentLine" ) : If (MBR = vbCancel) Then WScript.Quit 
    'vCurrentLine = replace(vCurrentLine, chr(34), "")  'Entferne alle Anführungszeichen 

    If(Right(vCurrentLine,1)= "\") Then
        '//Nur wenn es ein Ordner ist (TC hängt bei Ordnern ein "\" an) 
        bIsFolder = True
        Set oItem = FSO.GetFolder(vCurrentLine)
        sFullName  = vCurrentLine                    '//Ex: "X:\Work\Orders\File.txt"
        sName      = FSO.GetFileName(oItem)          '//Ex: "File.txt"
        sCreated   = oItem.DateCreated
        sAccessed  = oItem.DateLastAccessed
        sModified  = oItem.DateLastModified
    Else
        '//Es ist eine Datei 
        bIsFile = True
        Set oItem  = FSO.GetFile(vCurrentLine)      '//Ex: "X:\Work\Orders\File.txt"
        sFullName  = vCurrentLine                    '//Ex: "X:\Work\Orders\File.txt"
        sName      = FSO.GetFileName(oItem)          '//Ex: "File.txt"
        sBase      = FSO.GetBaseName(oItem)          '//Ex: "File"
        sExte      = FSO.GetExtensionName(oItem)     '//Ex: "txt"
        sExteWDot  = "." & sExte
        sFullNameWOExt = oItem.ParentFolder  & "\" & sBase
        sNameWOExt = sBase
        sSize      = oItem.Size
        sVers      = FSO.GetFileVersion(oItem)
        sCreated   = oItem.DateCreated
        sAccessed  = oItem.DateLastAccessed
        sModified  = oItem.DateLastModified
    End If 
        '//Gemeinsam
        sDrive     = FSO.GetDriveName(oItem)                    '//Ex: "X:"
        sDriveWoC  = Replace(sDrive,":","")                     '//Ex: "X"
        sPath      = oItem.ParentFolder                         '//Ex: "X:\Work\Orders"
        sPathWoC   = Replace(oItem.ParentFolder,":","")         '//Ex: "X\Work\Orders"
        sPathBS    = sPath & "\"                                '//Ex: "X:\Work\Orders\"
        aPathArray = split(sPath, "\")
        'MsgBox UBound(aPathArray),,"Debug Array Length"
        If(UBound(aPathArray)>0) Then vsParent   = aPathArray( UBound(aPathArray)   )
        If(UBound(aPathArray)>1) Then vsGrandP1  = aPathArray( UBound(aPathArray) -1)
        If(UBound(aPathArray)>2) Then vsGrandP2  = aPathArray( UBound(aPathArray) -2)
        If(UBound(aPathArray)>3) Then vsGrandP3  = aPathArray( UBound(aPathArray) -3)
        If(UBound(aPathArray)>0) Then vsTopFld   = aPathArray( 1)
        If(UBound(aPathArray)>1) Then vsTopFld2  = aPathArray( 2)
        

        '// HIER etwas mit jeder Datei / Ordner / Zeile aus der "%L"-Liste arbeiten: 

        'DoSomethingWith vsName

            '//Beispiel:
            X = X & "sFullName"     & vbTab & sFullName     & vbLF
            X = X & "sName"         & vbTab & sName         & vbLF
            X = X & "sBase"         & vbTab & sBase         & vbLF
            X = X & "sExte"         & vbTab & sExte         & vbLF
            X = X & "sExteWDot"     & vbTab & sExteWDot     & vbLF
            X = X & "sFullNameWOEx" & vbTab & quote(sFullNameWOExt) & vbLF
            X = X & "sNameWOExt"    & vbTab & quote(sNameWOExt)    & vbLF
            X = X & "sSize"         & vbTab & sSize         & vbLF
            X = X & "sVers"         & vbTab & sVers         & vbLF
            X = X & "sCreated"      & vbTab & sCreated      & vbLF
            X = X & "sAccessed"     & vbTab & sAccessed     & vbLF
            X = X & "sModified"     & vbTab & sModified     & vbLF
            X = X & "vsParent " & vbTab & vsParent & vbLF
            X = X & "vsGrandP1" & vbTab & vsGrandP1& vbLF
            X = X & "vsGrandP2" & vbTab & vsGrandP2& vbLF
            X = X & "vsGrandP3" & vbTab & vsGrandP3& vbLF
            X = X & "vsTopFld " & vbTab & vsTopFld & vbLF
            X = X & "vsTopFld2" & vbTab & vsTopFld2& vbLF
            'MsgBox X


            '//Entferne die Extension / Erweiterung:
            sOutputSammlung = sOutputSammlung & quote(sFullNameWOExt) & vbCRLF

Loop
oTextStream.Close
'=========================================================================

'// Am Ende gib das Ergebnis aus:
'ClipboardSET sOutputSammlung
MsgBox sOutputSammlung

'=========================================================================
'=========================================================================  F U N K T I O N E N
'=========================================================================
'=========================================================================
Function Quote(str)
    Quote = chr(34) & str & chr(34)
End Function 'Quote(str)
'=========================================================================
Function ClipboardSET( StrToCopy)
On Error Resume Next
	Dim objIE : Set objIE = CreateObject("InternetExplorer.Application")
	  objIE.Navigate("about:blank")
	  objIE.document.parentwindow.clipboardData.SetData "text", StrToCopy
	  objIE.Quit
End Function
'=========================================================================
Sub WorkOnSubfolders(strPath)
'//Sub-Routine um alle Unterordner ab zu arbeiten:
            Set objMainFolder = FSO.GetFolder(strPath)
            For Each oSubfolder in objMainFolder.SubFolders
                For Each oFile in oSubfolder.Files
                    DoSomethingWith oFile
                Next
                '//Für Unterordner der Unterordner rufe die Routine erneut auf:
                WorkOnSubfolders oSubfolder
            Next
End Sub 'WorkOnSubfolders 
'=========================================================================
Sub DoSomethingWith(oFile)
'//Individual Script, je nach Anwendungsfall:
    MBR = MsgBox( vCurrentLine,1,"DoSomethingWith oFile" ) : If (MBR = vbCancel) Then WScript.Quit
End Sub 'DoSomethingWith 
'=========================================================================

- - -


Beispiel-VBScript um die Erweiterung bei allen ausgewählte Dateien zu entfernen:

Kommando: "L:\aufwerk\Pfad zu\ForEach-EntferneDieErweiterung.vbs"
Parameter: "%L"
Startpfad:
Icondatei: wscript.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen. Ebenso den Pfad zur VBS)



Eventuell kommt eine Meldung bzgl. einer Webseite, dass kommt von der eingebauten 'Clipboard'-Funktion.


ForEach-EntferneDieErweiterung.vbs

Code: Select all

'Kommando: "L:\aufwerk\Pfad zu diesem\Skript.vbs"
'Parameter: "%L"
'[x] Als Symbol (minimiert)

Set FSO  = CreateObject("Scripting.FileSystemObject") 
sTCTempList = WScript.Arguments(0)
Set oTextStream = FSO.OpenTextFile(sTCTempList,1)
Do Until oTextStream.AtEndOfStream
    vCurrentLine = oTextStream.ReadLine
    If(Right(vCurrentLine,1)= "\") Then
        '//Nur wenn es ein Ordner ist (TC hängt bei Ordnern ein "\" an) 
        bIsFolder = True
        Set oItem = FSO.GetFolder(vCurrentLine)
    Else
        '//Es ist eine Datei 
        bIsFile = True
        Set oItem  = FSO.GetFile(vCurrentLine)
    End If 
        '//Gemeinsam
        sFullName  = vCurrentLine                    '//Ex: "X:\Work\Orders\File.txt"
        sFullNameUnix = replace(oItem.ParentFolder,"\","/")  &"/"& sBase '//Ex: "X:/Work/Orders/File.txt"
        sFile = "//file:/" & replace(sFullNameUnix,":","")    '//Ex: "//file:/X/Work/Orders/File.txt"
        sName      = FSO.GetFileName(oItem)          '//Ex: "File.txt"
        sBase      = FSO.GetBaseName(oItem)          '//Ex: "File"
        sExte      = FSO.GetExtensionName(oItem)     '//Ex: "txt"
        sExteWDot  = "." & sExte                     '//Ex: ".txt"
        sFullNameWOExt = oItem.ParentFolder  &"\"& sBase '//Ex: "X:\Work\Orders\File"
        sNameWOExt = sBase                            '//Ex: "File"
        '//Entferne die Extension / Erweiterung:
        sOutputSammlung = sOutputSammlung & quote(sFullNameWOExt) & vbCRLF
        sOutputSammlung2 = sOutputSammlung2 & sNameWOExt & vbCRLF
        sOutputSammlung3 = sOutputSammlung3 & sNameWOExt & ".NEU" & vbCRLF
        sOutputSammlung3 = sOutputSammlung3 & sNameWOExt & ".NEU" & vbCRLF
        sOutputSammlung4 = sOutputSammlung4 & sFullNameUnix & vbCRLF
        sOutputSammlung5 = sOutputSammlung5 & sFile & vbCRLF
Loop
oTextStream.Close
'=========================================================================

'// Am Ende gib das Ergebnis aus:
'ClipboardSET sOutputSammlung
MsgBox sOutputSammlung
MsgBox sOutputSammlung2
MsgBox sOutputSammlung3
MsgBox sOutputSammlung4
MsgBox sOutputSammlung5

'=========================================================================
'=========================================================================  F U N K T I O N E N
'=========================================================================
'=========================================================================
Function Quote(str)
    Quote = chr(34) & str & chr(34)
End Function 'Quote(str)
'=========================================================================
Function ClipboardSET( StrToCopy)
On Error Resume Next
	Dim objIE : Set objIE = CreateObject("InternetExplorer.Application")
	  objIE.Navigate("about:blank")
	  objIE.document.parentwindow.clipboardData.SetData "text", StrToCopy
	  objIE.Quit
End Function
'=========================================================================

- - -

PowerShell - alles im Button
ACHTUNG - für PowerShell Syntax im TC-Button:
-- PowerShell-Zeichen '%' verdoppelt zu %%
-- Anführungszeichen verdreifachen zu """...$...""",
---- oder, wenn keine $-Variable expandiert werden muss, einfache Anführungszeichen verwenden: '.....'



PowerShell - alles im Button - 1

Kommando: PowerShell -NoExit
Parameter: TYPE '%L' | ForEach{ $_ }
Startpfad:
Icondatei: powershell.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen -hier einfache Anführungszeichen- setzen.)


- - -

PowerShell - alles im Button - 2

Kommando: PowerShell
Parameter: TYPE """%L""" | ForEach{ copy $_ -recurse 'F:\tmp\predefined destination'}

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in -hier dreifache- Anführungszeichen setzen.)


- - -

Ersetze Backslash '\' zu 'Unix'-Slash '/':

Kommando: PowerShell
Parameter: TYPE """%L""" | Foreach{$_ -Replace """\\\\""" . """/"""}|clip
-oder-
Parameter: TYPE '%L' | Foreach{$_ -Replace [regex]::escape('\'), '/'}|clip

- - -

PowerShell - Skript aufrufen

Kommando: Powershell -NoProfile -NoExit -ExecutionPolicy Unrestricted "%COMMANDER_PATH%\ForEachFileDo.ps1"
Parameter: "%L"
Startpfad:
Icondatei: powershell.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert


ForEachFileDo.ps1

Code: Select all

Get-Content $Args[0] | ForEach-Object{ $F=(Get-Item($_)); $F }	

- - -



PowerShell - funktionierendes Beispiel
http://ghisler.ch/board/viewtopic.php?t=47504


Hier erst mal die pure PowerShell Syntax:
GCI | ForEach{ $_.LastWriteTime = ($_.LastWriteTime).AddYears(-1) }



Hier das ausführliches PS-Skript:

Kommando: Powershell -NoProfile -NoExit -ExecutionPolicy Unrestricted "%COMMANDER_PATH%\ForEachFileDo_TIMESTAMP.ps1"
Parameter: "%L"
Startpfad:
Icondatei: powershell.exe
Icon:
Tooltip:
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert


ForEachFileDo_TIMESTAMP.ps1

Code: Select all

# PowerShell Script for Total Commander
# Stefan, 14. March 2017
# http://ghisler.ch/board/viewtopic.php?t=47504
# Adjust timestamp of all selected files
# Example:
#  FROM:
#    24.12.2001
#  TO:
#    24.12.2000
#
# Usage:
#  Create TC button
#    Cmd=Powershell -NoProfile -NoExit -ExecutionPolicy Unrestricted "%COMMANDER_PATH%\ForEachFileDo_TIMESTAMP.ps1"
#    Param="%L"
#    [X] Run minimized
#
#       Tip: remove '-NoExit' to let the console window close after work.
#
# Select all files and execute this script. Done.
#
#
# ==============================================================================
# // The script

# // Check arguments:
If ($Args.Count -eq 0) { "Please use '%L' as TCs parameter. Also select one or more files first. Script quits here."; return}

# //DEBUG:
# Notepad $Args[0]
# TYPE $Args[0]

# //Prompt the user:
$a = new-object -comobject wscript.shell
$b = $a.popup("Continue changing timestamp? (Inspect script first)",0,"Change Timestamp",1)
if ($b -eq 2){
    # Write-Host "You pressed Cancel. Script quits here.`n`n`nPress any key to close..."
    # $x = $host.UI.RawUI.ReadKey()
    Return
    }

# //Do the WORK:
 TYPE $Args[0] | ForEach{$F=(Get-Item($_));$F.LastWriteTime=($F.LastWriteTime).AddYears(-1)}
 
 
# -----------------------------------------------------------------
# // some alternatives:

#   CreationTime
#   LastWriteTime
#   LastAccessTime

#    AddDays
#    AddHours
#    AddMilliseconds
#    AddMinutes
#    AddMonths
#    AddSeconds
#    AddTicks
#    AddYears
#    Usage:
#    AddYears(2)    # add plus two years
#    AddYears(-4)   # extract minus four years
# -----------------------------------------------------------------

# // or: adjust days and hours and more at the same time
# $MyTimeStamp = New-TimeSpan -Days 1 -Hours 2 -Minutes 30
# TYPE $Args[0] | ForEach{$F=(Get-Item($_));$F.LastWriteTime=($F.LastWriteTime) + $MyTimeStamp}
# -----------------------------------------------------------------
# // or: set time only
#TYPE $Args[0] | ForEach{$F=(Get-Item($_));$F.LastWriteTime= "07:55:56"}
# -----------------------------------------------------------------
# // or: set whole new date (MONTH.DAY.YEAR format depends on your system settings)
# Suppose today is August 31, 2007. In the US, we’d list the date like this: 8/31/2007, the format being month/day/year. 
# In a very large portion of the world, however, that same date is listed like this: 31/8/2007, the format being day/month/year.
# https://technet.microsoft.com/en-us/library/ee692801.aspx
# TYPE $Args[0] | ForEach{$F=(Get-Item($_));$F.LastWriteTime= "12.24.2005 07:07:34"}
# First of April at midnight:
# TYPE $Args[0] | ForEach{$F=(Get-Item($_));$F.LastWriteTime= "4.1.2005 00:00:00"}
# -----------------------------------------------------------------
# Pure PowerShell syntax:
# GCI | ForEach{ $_.LastWriteTime = ($_.LastWriteTime).AddYears(-1) }
# -----------------------------------------------------------------


- - -

AutoHotkey

Hier wird AHK portable verwendet, ist also nicht installiert,
bei einem installiertem AHK würde der Aufruf der *.AHK Skriptdatei ausreichen.


Kommando: "L:\Pfad\zu\AutoHotkey.exe" "L:\Pfad\zu\Script.ahk"
Parameter: "%L"
Startpfad:
Icondatei: "L:\Pfad\zu\AutoHotkey.exe"
Icon:
Tooltip: Dieser Button macht...|dies und|das
Programm ausführen: [_]als Symbol (minimiert) / [_]maximiert

(Wie oben geschrieben, den %L-Parameter am Besten vorsichtshalber in Anführungszeichen setzen. Ebenso den Pfad zur AHK-Skriptdatei)


Code: Select all

#SingleInstance force    ;Skips the dialog box and replaces the old instance automatically

If (%0% > 0)
    vTCtempfile=%1%
} else {
    MsgBox TC file list parameter "`%L" is missing, see TC help for more (Search for: Configuration - Change button bar).
    ExitApp
}

;//Process the file list, line by line:
Loop, Read, %vTCtempfile%
{
    vCurrTempFileLine = %A_LoopReadLine%
    MsgBox Curr line is:`n%vCurrTempFileLine%
  
  
} ; next line
;// All lines done.




# # # # # # # # # # # # # # # # # # # # # # # # # # #

Weitere Beispiele





- - -

Verschiebe ausgewählte Datei eine Ebene (ein Ordner) höher:

Von:
L:\aufwerk\Arbeit 2017\Ein Gang\An Leitung.txt
L:\aufwerk\Arbeit 2017\Ein Gang\Back Up.doc
L:\aufwerk\Arbeit 2017\Ein Gang\Can Cel.png
ZU:
L:\aufwerk\Arbeit 2017\An Leitung.txt
L:\aufwerk\Arbeit 2017\Back Up.doc
L:\aufwerk\Arbeit 2017\Can Cel.png

Code: Select all

TOTALCMD#BAR#DATA
%ComSpec% /c
for /f "delims=" %%a in (%F) do move "%%a" ..
%windir%\system32\shell32.dll,146
Verschiebe die ausgewählten Dateien eine Ebene hoch

1
-1


Für Dateien mit Umlaute:

Code: Select all

TOTALCMD#BAR#DATA
%ComSpec% /c chcp 1252 & cmd /c
for /f "delims=" %%a in ('type "%F"') do move "%%a" ..
%windir%\system32\shell32.dll,146
Verschiebe die ausgewählten Dateien eine Ebene hoch

1
-1

Testdateinamen:
An Leitung Öltanker & Bäckertröge.txt
Back Up Ärger über Östrogänüberschuß.doc
Can Cel Überraschung 'Nötigung' ändern über Äckerböden.png





- - -

Eine Liste der markierten Dateien erstellen:


Alle gewünschten Dateien markieren, und dann den Button drücken,
dann sollte die PlayList.m3u deine playlist enthalten.

Code: Select all

TOTALCMD#BAR#DATA
%ComSpec% /c move
"%L" PlayList.m3u.txt
%windir%\system32\shell32.dll,168
Erstelle eine Liste der ausgewählten Dateien

1
-1

- - -


cm_CopyBaseNamesToClip

Den Dateinamen EINER Datei ohne die Erweiterung in die Zwischenablage kopieren:

Code: Select all

TOTALCMD#BAR#DATA
cmd /c
echo %O | clip
%Commander_Path%\WCMICONS.DLL,7
Kopiere den Namen der ausgewählten DATEI ohne Erweiterung in die Zwischenablage

1
-1


Den Dateinamen einer oder mehreren Dateien ohne die Erweiterung in die Zwischenablage kopieren:

Code: Select all

TOTALCMD#BAR#DATA
cmd /c
del %tmp%\tmp && chcp 1252 &&  for /F "tokens=*" %%F in ('type %F') do (@echo %%~nF >> %tmp%\tmp) && type %tmp%\tmp | clip
%Commander_Path%\WCMICONS.DLL,7
Kopiere den Namen aller ausgewählten DATEIEN ohne Erweiterung in die Zwischenablage

1
-1

Testdateinamen:
An Leitung Öltanker & Bäckertröge.txt
Back Up Ärger über Östrogänüberschuß.doc
Can Cel Überraschung 'Nötigung' ändern über Äckerböden.png



- - -


Kopiere eine Datei und hänge einen Zähler an:

PlayList.txt
PlayList_001.txt
PlayList_002.txt
PlayList_003.txt


Die Batchdatei:

KopiereDateiMitZähler.cmd

Code: Select all

@echo off
REM MVV Posted: Wed May 08, 2013 
REM http://ghisler.ch/board/viewtopic.php?p=264371#264371
if -%1==- echo Parameters: %%P%%N & pause & goto :EOF
set counter=0
:next_name
set /a counter=%counter%+1
SET counter=00000%counter%
SET counter=%counter:~-3%
set copy_name=%~dpn1_%counter%%~x1
if exist "%copy_name%" goto next_name
copy %1 "%copy_name%"

Der Button dazu:

Code: Select all

TOTALCMD#BAR#DATA
"%Commander_Path%\KopiereDateiMitZähler.cmd"
%P%N
C:\Windows\System32\imageres.dll,-68
Kopiere Datei Mit Zähler


-1

- - -


Kopiere eine Datei und hänge einen Zeitstempel an:


PlayList.txt
PlayList_171223_125539.txt
PlayList_171223_125548.txt
PlayList_171223_125556.txt


Die Batch:

KopiereDateiMitZeitstempel.cmd

Code: Select all

@echo off
if -%1==- echo Parameters %%P%%N are missing & pause & goto :EOF

  FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO Set _DTS=%%a

  REM 2017-12-23_13-49-03
  REM Set MyDateTime=%_DTS:~0,4%-%_DTS:~4,2%-%_DTS:~6,2%_%_DTS:~8,2%-%_DTS:~10,2%-%_DTS:~12,2%

  REM 201223_134953
  REM Set MyDateTime=%_DTS:~0,2%%_DTS:~4,2%%_DTS:~6,2%_%_DTS:~8,2%%_DTS:~10,2%%_DTS:~12,2%


  Set MyDateTime=%_DTS:~0,2%%_DTS:~4,2%%_DTS:~6,2%_%_DTS:~8,2%%_DTS:~10,2%%_DTS:~12,2%
  Copy %1 "%~dpn1_%MyDateTime%%~x1"


Der Button:

Code: Select all

TOTALCMD#BAR#DATA
"%Commander_Path%\KopiereDateiMitZeitstempel.cmd"
%P%N
C:\Windows\System32\imageres.dll,-68
Kopiere Datei Mit Zeitstempel


-1



- - -





 
Last edited by Stefan2 on 2018-02-07, 21:04 UTC, edited 18 times in total.
JOUBE
Power Member
Power Member
Posts: 1447
Joined: 2004-07-08, 08:58 UTC

Post by *JOUBE »

Schön. Bitte ab ins Wiki damit...

(Psst: Ist ja grauenhaft. ;-) Wer soll das alles lesen. Vor allem, wenn er es aktuell nicht braucht.)

JOUBE
User avatar
tuska
Power Member
Power Member
Posts: 3740
Joined: 2007-05-21, 12:17 UTC

Post by *tuska »

Nichts für ungut, aber ich zähle mich eher zu denen, die in diversen Foren mitlesen und nur eher selten im TC Wiki nachlesen.

Mein Vorschlag/Bitte an Stefan2:
Wenn Du Deine Tippsammlungen in den Foren veröffentlichst, könntest Du dann bitte beim ersten Eintrag
eine Liste der Tipps (zB Titel / Tags) anlegen/aktualisieren - im Idealfall mit Verlinkung zum Thema?

Dies würde schon ganz am Anfang einen Überblick geben, welche Themen in diesem Thread behandelt werden
bzw. könnte jemand gezielt die Informationen per Link aufsuchen, die ihn interessieren.
User avatar
raeubi
Power Member
Power Member
Posts: 575
Joined: 2003-11-25, 09:01 UTC
Location: Rhein/Main

Re: Autom: Aktion für ausgewählte Dateien/Ordner ausführen

Post by *raeubi »

Danke an Stefan2 für die Mühe, die Du hier reinsteckst! Beeindruckend!
Und es ist viel wirklich Interessantes dabei.

Vorschlag: Den Inhalt in Wiki-Artikel posten und diese hier zu verlinken?

Irgendwie wirkt der Thread sehr "erschlagend" selbst für einen interessierten Mitleser wie mich ...

Nichts für ungut und dickes DANKESCHÖN nochmal.
Räubi
(#2852 + #287609)
User avatar
matixx
Power Member
Power Member
Posts: 1117
Joined: 2003-03-21, 02:37 UTC
Location: ....

Post by *matixx »

Mein Vorschlag/Bitte an Stefan2:
Wenn Du Deine Tippsammlungen in den Foren veröffentlichst, könntest Du dann bitte beim ersten Eintrag
eine Liste der Tipps (zB Titel / Tags) anlegen/aktualisieren - im Idealfall mit Verlinkung zum Thema?

Dies würde schon ganz am Anfang einen Überblick geben, welche Themen in diesem Thread behandelt werden
bzw. könnte jemand gezielt die Informationen per Link aufsuchen, die ihn interessieren.
Unbedingt!
User avatar
HolgerK
Power Member
Power Member
Posts: 5406
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

@matixx
Am Ende des ersten Posts steht doch bereits seit Dienstag abends das Inhaltsverzeichnis.
:roll:
Holger

PS: Ich finde es toll was Stefan2 hier aufbaut.
Und ja, es könnte auch im Wiki untergebracht werden, aber ich glaube das dieser Thread hier im Forum deutlich mehr Aufmerksamkeit erreicht als ein Wiki-Eintrag.
Make our planet great again
User avatar
tuska
Power Member
Power Member
Posts: 3740
Joined: 2007-05-21, 12:17 UTC

Post by *tuska »

2Stefan2
Besten Dank für Deine Überarbeitungen und Ergänzung eines Inhaltsverzeichnisses!

Möchte Dich keineswegs überstrapazieren, aber vielleicht könntest Du bitte da auch noch eine Ergänzung vornehmen?
'TC' -Tipp des Tages: Wusstest du schon... - Das Interesse ist hier besonders groß, schon weit mehr als 5.000 Aufrufe!

Nochmals Danke für Deine Bemühungen!
Gruß,
Karl
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Autom: Externe Tools zur Abarbeitung der gewählten Dateien

Post by *Stefan2 »

Post 4 - Externe Tools zur Abarbeitung der ausgewählten Dateien


Externe Tools zur Abarbeitung der ausgewählten Dateien

Hier ist eine Sammlung von externen Tools, welche für den TC geschrieben wurden,
um die Abarbeitung der ausgewählten Dateien mit einer bestimmten Anwendung zu vereinfachen,
ohne dass man die im letzten Posting beschriebenen Skripte einsetzen muss.


Falls jemand diese Tools verwendet, postet bitte Verbesserungen zu dieser Auflistung und Einsatzbeispiele, danke schön.



#################################### ####################################


Allgemeine Informationen: TC-Tipp des Tages: Plugin Add-On Externe Tools (Klick)



#################################### ####################################


MakeBAT

MakeBAT by Christian Ghisler


<to do>


https://www.ghisler.com/dplugins.htm
MakeBAT plugin by Christian Ghisler - a plugin to create batch files
Plugin zum Erzeugen von Batchdateien (*.bat) mit allen markierten Dateien,



Installation:
=============

1. Unzip the makebat.wcx to the Totalcmd directory
2. In Total Commander, choose Configuration - Options
3. Open the 'Packer' page
4. Click 'Configure packer extension WCXs'
5. type 'bat' as the extension (without the single quotes)
6. Click 'new type', and select the makebat.wcx
7. Click OK

Read the "install.txt"


Useful tip that is not in README:
if your string starts and ends with a quote as in
"c:\pgm files\tc\some.exe" %N "C:\docs & setngs\"
you need to double up on the first and last quotes
""c:\pgm files\tc\some.exe" %N "C:\docs & setngs\""
due to the WindowsTM API may removes outer quotes on strings on writing/reading.

Also note that some called third-party tool may interpret
the trailing __\"__ as like "escape the quote as to remove them".


Usage:
======
- Select wanted files
(here for example from TCs LANGUAGE-folder:
WCMD_DEU.MNU
WCMD_ENG.MNU
)

- Call pack dialog Alt+F5
- choose as "packer" the 'bat' from the drop-down list
- click [OK]

- In dialog box enter wanted command line, like: ECHO %O
(right click a button on TCs buttonbar, click Change...,
click [Help] to read more about variables like "%O")
- click [OK]

- Find in other panel a new textfile "<folder name>.bat"
(for our example: "LANGUAGE.BAT" with content:
ECHO WCMD_DEU
ECHO WCMD_ENG
)


Now open that text file
- adjust the command lines if need
(read the instructions of the called application what it needs as command)
- add on top as first line: @ECHO OFF
- add as last line: PAUSE
So you get:
@ECHO OFF
ECHO WCMD_DEU
ECHO WCMD_ENG
PAUSE

Now your batch is ready to be started



#################################### ####################################

List2multiInstance aka List To MultiInstance aka L2M

Name:
List2multiInstance
List To MultiInstance aka L2M
by Andrey V. Sorokin

Download:
https://www.ghisler.com/dtools.htm
lst2multi v1.3 >> lst2multi.zip
List zu Multi-Instanz Konverter. Dieses Tool kann zusammen mit dem Buttonbar von Total Commander verwendet werden,
um alle markierten Dateien in einem bestimmten Programm zu laden.

http://www.ghisler.ch/board/viewtopic.php?p=191828#191828
sqa_wizard Posted: Thu Dec 03, 2009 22:18 >> 'List To MultiInstance' > http://tirna.narod.ru/soft/files/l2m_v2005.1.3.180.rar


Anwendung:
- Im TC-Ordner einen Unterordner "TOOLs" anlegen.
- Tool downloaden und nach "TC-Ordner\TOOLs\List2multiInstance" entpacken.
- - -Man erhält eine "lst2mlt.exe" von 2001 v1.3 bzw. eine "l2m.exe" von 2005 v1.3.180
- Mit diese Exe einen Button anlegen, siehe die Hilfe zu diesem Tool sowie die Hilfe zu deiner Anwendung, welche aufgerufen werden soll.

Hilfe:
Starte die 'l2m.exe' mit deiner aufzurufenden Anwendung sowie der "%L" TC-Liste mit den ausgewählten Dateien.

You pass to l2m.exe a filename of program which you want to start parameter (optional) and filename of list-file, which include filenames of files needed to open. You also can pass some additional parameters.


Basic-Syntax:

...start the program and to pass to the program as parameters some files.
l2m.exe /L:<Dateiliste> [/X:<Anwendung.exe>] [/B:<AnwendungsParameter vor dem Dateinamen>] [/E:<AnwendungsParameter nach dem Dateinamen>]
[/W] [/S] [/P] [/F:<pause>] [/G:<gui mode>] [/R:<RegExp>] [/I] /J:<project>] [/M:<window_mode>] [/O:<priority>]

l2m.exe startet für jede Datei in der "%L" TC-Liste (/L:"%L") die Anwendung (/X:"pfad\zu\Anwendung.exe")

l2m.exe starts for each file from <List-file> the application <Exe file> (or associated application), pass it, <b-params> and <e-params> as parameter.
If regular_expression exists It applyed to filename name and it's result uses in <b-params> and <e-params>.



Zum Beispiel:
For example.

Der Inhalt einer Textdatei "list-file.txt" sei:
... c:\1.txt
... c:\2.txt
... c:\autoexec.bat

Wenn man jetzt über den Windows Run-Dialog das folgende Kommando eingibt:
... l2m.exe /X:notepad.exe /L:list-file.txt
würde Notepad.exe dreimal gestartet werden:
After you press "Enter" "List To MultiInstance" execute this commands:
... notepad.exe c:\1.txt
then
... notepad.exe c:\2.txt
and finally
... notapad.exe c:\autoexec.bat
Now you have 3 Notepad with opened files in its. Enjoy =)


- - -

Beispielanwendung in TC:

Well, I think what it is possible to receive the best results and pleasure only having attached this programs to Total Commander.

HOW TO ATTACH TO TOTAL COMMANDER?



Create menuitem of Start-menu or Toolbar button and specify so:

Kommando : "%Commander_Path%\TOOLs\List2multiInstance\l2m.exe
Parameter: /X:"<Path to exe file>" /L:"%L"
Startpfad:
Icondatei: %Commander_Path%\WCMICONS.DLL
Tooltip:


So, for example, for EditPlus2 on my computer the command look so:
Command: "%Commander_Path%\TOOLs\List2multiInstance\l2m.exe
Parameters: /X:"C:\Program Files\EditPlus 2\editplus.exe" /L:"%L"





Instead of %L you can use %l, %F, %f, %D, %d. Look Help if Total Commander.
Now select files and run created menu- or toolbar- command.

Enjoy =). It's Free =). And only for you =)

- - -


PRE- AND POST- PARAMETERS.

If program which open file from list can parse addition parameters passed from
command line, you can add its to L2M parameters and its has been added to each
file in list. Some program require parameters before file name, another - after
filename and another don't make differences. List To MultiInstance allow use any
way fro pass parameters.

For example, NullSoft WinAmp allow enqueue file passed to it and dont play file
immediately. To do this you must set "Enqueue as default action" in WinAmp
settings. But let you don't want to set default action as Enqueue. Then you can
add file to enqueue by command like:

winamp.exe /ADD <path to mp3-file>

If you want add many files to winamp playlist you can use L2M aby command like
(in Total Commander):

Kommando : "%Commander_Path%\TOOLs\List2multiInstance\l2m.exe
Parameter: /B:/ADD /L:"%L" /X:"C:\Program Files\Winamp\winamp.exe" /W



#################################### ####################################


List2Run

Name:
List2Run by JackFoo

Download:
http://ghisler.ch/board/viewtopic.php?t=3418

Anwendung:
- Den kompletten Code von "MIME-Version: 1.0" bis zum "=" als List2Run.b64.txt Textdatei speichern.
- Die List2Run.b64.txt Datei auswählen und übers Menü "Dateien > Datei decodieren" entpacken.
- Die entpackte RAR-Datei ebenfalls entpacken, man erhält eine "lst2run.exe"
- Erstelle im TC-Unterordner "TOOLs" einen Ordner "List2Run", kopiere die EXE dort rein.
- Erstelle eine Textdatei "lst2run.txt" und kopiere den Hilfetext von der Webseite dort rein, abspeichern, fertig.
- Erstelle einen Button in TC wie in der List2Run-Hilfe sowie in der Hilfe deines Programms angegeben.


Hilfe:
List2Run ruft ein Programm (-e) für jede ausgewählte Datei in der mit dem TC-Parameter "%L" erstellten Liste auf.
Runs the specified [exe] on every file in [list.file] with command derived from the expression.


Basic-Syntax:
lst2run [-h] [-e [Programm.exe]] [-s [expression]] [-l [dateiListe "%L"]] [-w [ms.]] [-p [ms.]] [-b]
lst2run [-h] [-e [exe]] [-s [expression]] [-l [list.file]] [-w [ms.]] [-p [ms.]] [-b]


List2Run-Parameter:
Verwendebare Parameter von List2Run sind '#f' für den Dateinamen, '#p' für den Dateipfad und '#e' für die Dateierweiterung.
Currently valid placeholders are [#f] file name, [#p] path, [#e] extension

Am Beispiel einer Datei namens 'c:\somedir\di1\my file.ornot'
Given a file [c:\somedir\di1\my file.ornot]
#p = [c:\somedir\dir1]
#f = [my file]
#e = [ornot]


Beispielanwendung in TC:
Example of usage with TC:

Kommando : "%Commander_Path%\TOOLs\Lst2Run\lst2run.exe"
Parameter: -s "a #f.rar \"#p\#f.#e\"" -e "C:\path\rar.exe" -l "%L"
Startpfad:
Icondatei: %Commander_Path%\WCMICONS.DLL
Tooltip:

Für jede Datei in (-l "%L") öffne (-e "C:\path\rar.exe") mit den RAR-Parametern (-s "a #f.rar \"#p\#f.#e\"")
also "a 'my file.rar' 'c:\somedir\di1\my file.ornot'

Beachte die \" -Syntax um Anführungszeichen einzufügen.


Will call rar to archive for every file in the list one by one.
* Note the \" before #p, this is needed to put quotes if the file/command contain spaces.


#################################### ####################################

lst2clip List2Clipboard

Name:
lst2clip List2Clipboard
http://www.ghisler.ch/board/viewtopic.php?t=1853

Download:
https://totalcmd.net/plugring/list2clip.html


Anwendung:
- Im TC-Ordner einen Unterordner "TOOLs" anlegen.
- Tool downloaden und nach "TC-Ordner\TOOLs\lst2clip" entpacken.
- - - Man erhält eine "Lst2Clip.exe" von 2003 v1.02
- Mit diese Exe einen Button anlegen, siehe die Hilfe zu diesem Tool.


Hilfe:
Dieses Programm ist als Ergänzung zu den internen Kommandos
•cm_CopyFullNamesToClip
• cm_CopyNamesToClip
• cm_CopyNetNamesToClip
• cm_CopySrcPathToClip
• cm_CopyToClipboard
• cm_CopyTrgPathToClip
gedacht.
Anders als bei den internen Kommandos kann man genau festlegen wie die Pfade kopiert werden.

Features:
• Lokalen Pfad in Netzwerkpfad umwandeln.
• Die Dateierweiterung weglassen.
• Die Pfadtiefe einstellen.
• Rückwärtsschrägstrich am Ende eines Pfades entfernen.
• Einen Text vor den Pfad stellen.
• Einen Text an den Pfad anhängen.
• Einen Textteil durch einen anderen ersetzen.



Basic-Syntax:
Lst2Clip.exe [/U] [/NE] [/PD] [/RB] [/P] [/S] [/R] /L

UNC-Pfad --- /U wandelt Pfade gemappter Laufwerke in UNC-Netzwerkpfade um.
Keine Erweiterung --- /NE (no extension) Hierbei wird die Dateierweiterung nicht mitkopiert.
Pfadtiefe --- /PD (path depth) Die Pfadtiefe regelt wieviele Teile (am Anfang und am Ende) des Pfades kopiert werden.
Prefix --- /P Prefix, der vor jeder Zeile eingefügt wird. Beispiel: /P:"PRE"
Suffix --- /S Suffix, der hinter jede Zeile eingefügt wird. Beispiel: /S:"POST"
Ersetzen --- /R sucht und ersetzt Zeichen. Beispiel: /R:"Righteous"="Lefteous" /R:"12345"="" . Es wird zwischen Groß- und Kleinschreibung unterschieden.



Beispielanwendung in TC:

Dateinamen mit Pfad aber ohne Erweiterung kopieren:

Kommando : "%Commander_Path%\TOOLs\lst2clip\lst2clip.exe" /NE
Parameter: /L:"%L"
Startpfad:
Icondatei: "%Commander_Path%\TOOLs\lst2clip\lst2clip.exe"
Tooltip: Dateinamen mit Pfad aber ohne Erweiterung kopieren


Für den "%L" -Parameter siehe die TC-Hilfe, für den /NE -Parameter siehe die lst2clip-Hilfe.

- - -

Dateinamen ohne Pfad und ohne Erweiterung kopieren:

Kommando : "%Commander_Path%\TOOLs\lst2clip\lst2clip.exe" /NE
Parameter: /L:"%F"
Startpfad:
Icondatei: "%Commander_Path%\TOOLs\lst2clip\lst2clip.exe"
Tooltip: Dateinamen ohne Pfad und ohne Erweiterung kopieren


Für den "%F" -Parameter siehe die TC-Hilfe

- - -

Ein weiteres Beispiel: Sie haben eine sehr langen Pfad und wollen ihn in einer lesbaren Form kopieren. Gegeben sei der Pfad
C:\Verzeichnis 1\Verzeichnis 2\Verzeichnis 3\Verzeichnis 4\Verzeichnis 5\Verzeichnis 6\Verzeichnis 7\Datei.txt
Kommando: Lst2Clip.exe /PD:"3"="3"
Parameter: /L:"%L"
Das Ergebnis lautet (Kopiere 3 Teile vom Anfang und 3 Teile vom Ende):
C:\Verzeichnis 1\Verzeichnis 2\...\Verzeichnis 6\Verzeichnis 7\Datei.txt

- - -

Statt
C:\Settings\boot\config.txt
kopiere
boot\config.txt

command: Lst2Clip.exe /PD:"0"="2"
parameter: /L:"%L"


- - -

Ein Pfad soll wie in java.net.URI aussehen. Der Pfad lautet beispielsweise:
C:\Meine Projekte\3D_App\src\gui\MainFrame.java
Er soll folgendermaßen kopiert werden:
file:/C:/Meine%20%Projekte/3D_App/src/gui/MainFrame.java

Kommando: Lst2Clip.exe /P:"file:/" /R:"\"="/" /R:" "="%20%"
Parameter: /L:"%L"
Tooltip: Ein Pfad soll wie in java.net.URI aussehen.

- - -

Weitere Beispiele:

Für java.net.URL müsste man die Felder wie folgt ausfüllen:
Kommando: Lst2Clip.exe /P:"file:/" /R:"\"="/"
Parameter: /L:"%L"

Für "Windows-Pfade" mit UNC-Prefix benötigt man folgende Einstellungen:
Kommando: Lst2Clip.exe /P:"\\?\" /R:"\"="\\"
Parameter: /L:"%L"

Um den aktuellen Quellpfad eines gemappten Laufwerks zu kopieren:
Kommando: Lst2Clip.exe /U
Parameter: /L:"%P"

Nur den aktuellen Quell-Verzeichnisnamen ohne abschließenden Rückwärtsschrägstrich kopieren:
Kommando: Lst2Clip.exe /PD:"0"="1" /RB
Parameter: /L:"%P"

- - -


Gibt es das Kommando `cm_CopyNetNamesToClip' (Copy names with UNC path) auch im UNIX style

Anstelle von:
c:\Temp\CCM68.tmp
UNIX-like:
/cygdrive/c/Temp/CCM68.tmp

Kommando = %COMMANDER_PATH%\Tools\Lst2Clip\Lst2Clip.exe
Parameter = /P:"/cygwin/" /R:":\"="/" /R:"\"="/" /R:" "="\ " /L:"%L"


- - -


for cygwin users it would be nice to have 'cm_CopyNetNamesToClip' in unix style.

e.g.:
cm_CopyNetNamesToClip --> c:\tmp\text.txt
new:
cm_CopyNetNamesCygwinToClip --> /cygdrive/c/tmp/text.txt

or
cm_CopyNetNamesToClip --> \\hostname\tmp\text.txt
new:
cm_CopyNetNamesUnixToClip --> //hostname/tmp/text.txt

whitespaces
win32: c:\tmp\my text file.txt
cygwin: /cygdrive/c/tmp/my\ text\ file.txt


Command = %COMMANDER_PATH%\Tools\Lst2Clip\Lst2Clip.exe
Parameter = /P:"/cygwin/" /R:":\"="/" /R:"\"="/" /R:" "="\ " /L:"%L"


- - -

c:\Users\nameofuser\AppData\Roaming\workDir
i woul[d need] a command to copy it with ambient variable. f.e.:
c:\Users\nameofuser\AppData\Roaming\APPDATA\workDir

Command = %COMMANDER_PATH%\Addons\lst2clip\Lst2Clip.exe /R:"%APPDATA%"="|APPDATA|" /R:"|"="%"
Parameter = /L:"%L"
Icon = %COMMANDER_PATH%\Addons\lst2clip\Lst2Clip.exe
Tooltip = Lst2Clip %APPDATA%



#################################### ####################################


lst2str

Name:
lst2str by JackFoo


Download:
https://www.ghisler.com/dtools.htm
lst2str v1.20
Aehnlich wie lst2multi, aber statt das Programm mehrfach aufzurufen wie list2multi,
ruft es das Programm nur 1x auf, und übergibt alle Dateinamen auf einer einzigen sehr langen Kommandozeile.

http://www.ghisler.ch/board/viewtopic.php?p=3023#3023 v1.10
http://www.ghisler.ch/board/viewtopic.php?p=3294#3294 v1.11


Anwendung:
- Im TC-Ordner einen Unterordner "TOOLs" anlegen.
- Tool downloaden und nach "TC-Ordner\TOOLs\lst2str" entpacken.
- - -Man erhält eine "lst2str.exe" von 2005 v1.20
- Mit diese Exe einen Button anlegen, siehe die Hilfe zu diesem Tool sowie die Hilfe zu deiner Anwendung, welche aufgerufen werden soll.


Hilfe:
Starte ein Programm (/X:[program.exe]) mit einer Liste von ausgewählten Dateien (/L:[listfile])
lst2str /X:[program.exe] /L:[listfile] /F:[file] /N:[nnn] /W:[state] /C:[nnn] /S:[switches]
lst2str /X:"c:\program files\winamp\winamp.exe" /L:%L /S:"/ADD" /W:m /E


Basic-Syntax:

lst2str /X:[program.exe] /L:[listfile] /F:[file] /N:[nnn] /W:[state] /C:[nnn] /S:[switches]

/X:[program.exe] : Anwendung.exe, welche für die ausgewählten Dateien gestertet werden soll. (NOT optional)
/L:[listfile ] : Die "%L" TC-Liste mit den ausgewählten Dateien. (NOT optional)
/F:[file ] : Eine zusätzliche Datei, als Letzte in die Kommandozeile eingefügt, und nur wenn der /N Parameter es noch erlaubt. (default: NONE)
/N:[nnn ] : Begrenze die maximale Anzahl an Dateinamen. (default: "INFINITE")
/W:[state ] : Anwendungsfenster M=maximiert; m=minimiert; h=hidden/versteckt. (default: will open the program in it's default state)
/C:[nnn ] : Limitiere die übergebene Länge der Kommandozeile. range [256-(2^16 - 1)]. (default: 256)
/S:[switches ] : Anwendungsparameter vor den Dateinamen setzen. (default: NONE)
/E ] : Zeigt Warnung, wenn Eingabe länger ist als mit /C angegeben. (OK->continue / CANCEL->exit). (default: no warning AND continue)



Beispielanwendung in TC:
3. Example:
lst2str /X:"c:\program files\winamp\winamp.exe" /L:"%L" /S:"/ADD" /W:m /E
Starte WinAmp minimiert mit dem /ADD Parameter und der "%L" TC-Liste mit den ausgewählten Dateien. Warne wenn die Kommandozeilen-Länge der ausgewählten Dateien länger ist wie 256.
This would start winamp (minimized) with the /ADD switch passing the contents of the [listfile] and if the data in the list file is longer than 256 will output a warning.

lst2str /X:"c:\program files\uedit\uedit32.exe" /L:"%L" /F:%T%M /N:2 /C:2048
Starte UltraEdit mit der "%L" TC-Liste mit zwei der ausgewählten Dateien. Falls das "/N"-Limit nicht erreicht wurde, füge den [file] Parameter hinzu, begrenze die Kommandozeilen-Länge auf 2048.
This would start UltraEdit with the files in [listfile] up to 2 and if it hasn't reached the limit adds the [file] parameter, while limiting the comand line length to 2048.

- - -

BTW, for ExamDiff, I used the following command :
Kommando : "%Commander_Path%\TOOLs\lst2str\lst2str.exe"
Parameter: /X:"C:\Program Files\ExamDiff Pro\ExamDiff.exe" /L:%L /F:%T%M /N:2 /C:4096
Startpfad:
Icondatei: %Commander_Path%\WCMICONS.DLL
Tooltip:

Wähle zuerst "die zweite" Datei (als '/F:') dann wechsle ins andere Panel und wähle "die erste" Datei (für '/L:"%L"'), dann klicke den Button an.
Nun wird das Programm mit der ersten Datei über '/L:"%L"' aufgerufen und die Zweite über '/F:%T%M'. Wichtig ist noch der '/N:2' Parameter.

This way you can put the files to compare on each side of TC, click on each and click on the assigned button and ExamDiff will pick the files.

- - -

Kommando : Path\to\Lst2str.exe
Parameter: /X:Path\to\textpad.exe /L:%L


#################################### ####################################


TCBL\

Bat Builder Launcher

Build & Launch a bat script for each file present in the ListFile.
http://tccfestuff.free.fr



<to do>


#################################### ####################################


TreeCopyPlus

Kopiere Dateien inklusive der Ordnerstruktur

Benutzt wird es in TC wie ein Packer, kopiert oder verschiebt Dateien aber inklusive der angegebenen Pfadtiefe.


Für zum Beispiel:
"C:\Program Files\totalcmd\plugins\", Ziel: "X:\BACKUP\"

Anzahl der Toplevel-Ordner: [0] (keine Ordner ausschließen, alle kopieren)
"X:\BACKUP\C\Program Files\totalcmd\plugins\"

Anzahl der Toplevel-Ordner: [1] (ersten Toplevel-Ordner ausschließen, nicht kopieren)
"X:\BACKUP\Program Files\totalcmd\plugins\"

Anzahl der Toplevel-Ordner: [2] (die ersten beiden Toplevel-Ordner ausschließen, nicht kopieren)
"X:\BACKUP\totalcmd\plugins\"

Anzahl der Toplevel-Ordner: [3] (die ersten drei Toplevel-Ordner ausschließen, nicht kopieren)
"X:\BACKUP\plugins\"



(Allgemeine Informationen: TC-Tipp des Tages: Plugin Add-On Externe Tools (Klick))



TreeCopyPlus 1.051

http://www.totalcmd.net/plugring/TreeCopyPlus.html
oder
http://www.ghisler.com/plugins.htm


Category: TC Packer Plugins
Status: freeware
Author: SUKER
Added: 15.11.2004
Updated: 27.09.2011
Download (x32, x64) (81 Kb)
TC-Forum http://ghisler.ch/board/viewtopic.php?t=5378


Schritt 1: Herunterladen
---------------------

- Das RAR-Archive downloaden.


Schritt 2: Installieren
---------------------

- Innerhalb vom TC das RAR doppelt anklicken, es erscheint:

---------------------------
wcx_TreeCopyPlus_1.051.rar
---------------------------
Dieses Archiv enthält das folgende
Plugin/Zubehör für Total Commander:

TreeCopyPlus 1.051

Möchten Sie es installieren?
---------------------------
Ja Nein
---------------------------




Installieren nach:
D:\rive\TotalCmd\plugins\wcx\TreeCopyPlus
[OK]

(Um portable zu sein, verwende "%Commander_Path%\plugins\wcx\TreeCopyPlus"




Verknüpfen: [TreeCopyPlus]
Verknüpfen mit:
D:\rive\TotalCmd\plugins\wcx\TreeCopyPlus
[OK]




----------------------------------------------------------------------------------
| Dadurch wird dieser wincmd.ini Eintrag erstellt:
| [PackerPlugins]
| TreeCopyPlus=D:\rive\TotalCmd\plugins\wcx\TreeCopyPlus\TreeCopyPlus.wcx
----------------------------------------------------------------------------------





Schritt 3: Anwenden
---------------------

Übersetzung der "ReadmeEng.txt", bitte diese ebenfalls lesen.

Funktioniert mit der Standard-Listenansicht, mit der Zweigansicht ('Befehle' Menü),
mit einem Suchergebnis (Suchen, dann [Anwenden] anklicken).


Zeige im einem Panel die zu kopierenden Dateien, im anderen den Zielordner.
(Eventuell führe zuerst eine Suche aus oder verwende die 'Zweigansicht')


Markiere alle zu kopieren Dateien.
(Nicht markierte und nicht gefundene Dateien sowie leere Ordner werden nicht kopiert)


Dücke Alt+F5, (**) wähle 'TreeCopyPlus' aus der Liste rechts "(o)-> [TreeCopyPlus]"
(** Bei einem ganz neuen TC, schließe den erscheinenden TC-Konfigurationsdialog)


ACHTUNG: bei "[x] In Archive verschieben" werden die Dateien verschoben, statt kopiert.


Drücke [Konfigurieren] um die Anzahl zu kopierender Ordner, ausgehend vom "aktuellen Ordner", einzustellen:
(Wenn der TC-Konfigurationsdialog erscheint, hast du noch "(o)ZIP" ausgewählt anstatt "TreeCopyPlus")
Number of upper levels to exclude:[1]
Anzahl der Toplevel-Ordner, welche nicht erstellt werden sollen:[1]



Beispiele
---------------------

Ordner zum kopieren:
"C:\Program Files\totalcmd\plugins\"
Zielordner:
"D:\ZIEL\"

Anzahl der Toplevel-Ordner: [0]
Alle Dateien und Unterordner werden kopiert von
"C:\Program Files\totalcmd\plugins\"
Zielordner:
"D:\ZIEL\C\Program Files\totalcmd\plugins\"

Anzahl der Toplevel-Ordner: [1]
"D:\ZIEL\Program Files\totalcmd\plugins\"

Anzahl der Toplevel-Ordner: [2]
"D:\ZIEL\totalcmd\plugins\"

Bei zu großer Nummer wie zB 4 oder 5, kommt eine Fehlermeldung und es wird nichts kopiert.



WICHTIG!!!
---------------------

Beim Kopieren aus einem Suchergebnis wird die Anzahl der Toplevel-Ordner
auf jede Datei / Ordner angewandt (from root to end).
Hier wird der "aktuelle Ordner" nicht bestimmt.
Dateien in weniger tiefen Ordner als eingestellt werden nicht kopiert!


Zum Beispiel:

Suchergebnis:
"C:\Program Files\totalcmd\plugins\"
"D:\win\UTIL\wincmd\PLUGINS\"
"D:\win\UTIL\plugin.txt"

Anzahl der Toplevel-Ordner: [4]
"D:\ZIEL\ ((contents of folder "C:\Program Files\totalcmd\plugins\"))"
"D:\ZIEL\PLUGINS\"
Wird nicht kopiert: "D:\win\UTIL\plugin.txt"



---------------------



Kleiner Nachteil der Plugins: 'etwas' umständlich, wenn man's häufiger brauch: ...Alt+F5 drücken, ...Plugin auswählen, ...Plugin einstellen.

Ein direkterer Weg zum Kopieren (Verschieben) von Source zu Target inklusive der Verzeichnisstruktur kann über ein Skript erreicht werden.

ZB mit solch einem VBScript.
viewtopic.php?p=327550#327550



---------------------


Um nur die Verzeichnissen inklusive Unterverzeichnisse, aber ohne Inhalte (Dateien) zu kopieren...

...kann man beim normalen Kopieren (F5) bei "Nur Dateien dieses Typs:" einfach das Wort 'KEINE' eintragen.

Dies "kopiert" (erstellt) Ordner und Unterordner im Ziel.


- - -


Um nur die ausgewählte "Top-Level"-Ordner (ohne Unterverzeichnisse) im Target zu erstellen,
kann man ein externes Skript verwenden (Batch/VBS/AutoHotkey...)

TC stellt dafür eigene Parameter bereit, zB "%F" und "%T" (drücke F1 im offenen Buttondialog für die Hilfe)



Hier eine "MS-DOS Batch", welche man komplett in einen Button schreiben kann (keine externe Datei benötigt)
Befehl: cmd.exe /c
Parameter: FOR /F "delims=" %%O in ('TYPE "%F"') DO md "%T%%O"
( %%O ist der Name meiner Variable in der Batch. Dort wird das Prozentzeichen verdoppelt, weil der Interpreter immer ein '%' entfernt)


Button-Code zum Kopieren und einfügen:

Code: Select all


TOTALCMD#BAR#DATA
cmd /c
for /f "delims=" %%O in ('TYPE "%F"') do md "%T%%O"
cmd
Erstelle ausgewählte Ordner im Target-Panel


-1

Erklärung zu TOTALCMD#BAR#DATA (Klick)




#################################### ####################################


Execute script and use result
WinScript Advanced 1.7 https://totalcmd.net/plugring/WinScriptAdv.html (Ovg)
Hier im Forum: https://www.ghisler.ch/board/viewtopic.php?t=44032


Script Content Plugin 0.2.0.2 by 'Lev Freidin: http://totalcmd.net/plugring/script_wdx.html
Hier im Forum: https://www.ghisler.ch/board/viewtopic.php?t=8615






#################################### ####################################


Python scripting platform for Windows with hotkeys, tray menu, HTTP-server and many more
Python scripting platform to process file paths
https://www.ghisler.ch/board/viewtopic.php?f=3&t=68764
https://github.com/vikilpet/Taskopy



#################################### ####################################






 
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post 5 - TC von außen steuern / SendMessage / WM_USER / WM_COPYDATA

Post by *Stefan2 »

Post 5 - TC von außen steuern / SendMessage / WM_USER


- - -

TC von außen mittels eines Skriptes steuern

Mit dem TC kann man bereits einiges mit den internen Möglichkeiten anfangen,
auch wenn man hier auch oft für komplexere Aufgaben ein externes Skript (Batch; VBS; AHK; PoSh;...) benötigt.
Der TC stellt hierzu Parameter bereit (aktueller und Zielpfad; Liste der ausgewählten Dateien; und viele mehr)
Siehe hierzu TC Automatisieren Skripten (Für jede Datei / Alle Dateien) >>> viewtopic.php?p=344898#p344898


Um den TC aber über ein externes Skript direkt zu steuern, um ihn zB TC-interne oder Benutzerdefinierte Befehle zu senden,
um Informationen und Daten zurück zu erhalten, um den TC zu automatisieren, kann man mit dem Konzept der "Windows Messages" arbeiten.

Dies soll eine kleine Anleitung sein, um zu zeigen, wie das mittels "SendMessage" und der in der HISTORY.TXT bereitgestellten Informationen
sowie den im Forum bereits gezeigten Beispielskripten und Erklärungen bewerkstelligt werden kann.
DANKE an alle Forumsmitglieder und der Suchmaschine meiner Wahl für all die geposteten Details, ohne Euch wäre dieser Beitrag nicht möglich!


Fangen wir vorne an:


Für IPC (Inter Process Communication) kommen mehrere Technologien/Mechanismen in Frage:
- UDP, TCP/IP
- Mail Slots
- Named Pipes
- Shared Memory
- Windows Messages

Alles was bei WindowsTM im GUI mit Fenstern bei einer oder zwischen verschiedenen Anwendungen geschieht,
wird über die Windows-API durch "Messages" (Nachrichten) und die "Windows Messages Queue" geregelt.

Dadurch werden Ereignisse (Klick auf Button) mitgeteilt, Text-Daten ausgetauscht oder Befehle gesendet.

Die Übertragung der Nachrichten geschieht über SendMessage- bzw. PostMessage-Befehle.
(SendMessage wartet auf eine Rückmeldung, PostMessage schickt einfach weg und macht weiter)



Wir benötigen für den TC ein externes Programm, welches uns die oben genannten Möglichkeiten anbietet, zum Beispiel:

-- AutoHotkey: siehe die Beispiele unten (im Forum sieht man auch AutoIt-Skripte)
-- MS-DOS Batch: verwende ein Programm, welches SendMessage beherrscht, zB NirSoft nircmd.exe, oder spezielle Tools auf TotalCmd.net
-- PowerShell+VBScript: auch hierzu existieren Funktionen im Internet, welche aber über COM auf InternetExplorer oder zB msWord zugreifen,
und dadurch langsam sind und auch teilweise "Wollen Sie wirklich"-Warnungen anzeigen.
Daher sind die ersten Beiden zu bevorzugen, oder man verwendet auch bei PoSh/VBS die Tools wie bei der MS-DOS Batch.
-- TotalCommander Button oder Benutzerdefinierter Befehl mit Möglichkeit des Tastaturkürzels:
Erstelle ein Skript mit AutoHotkey oder eine Batch, und starte diese über den TC. (Hierzu existieren weiter FAQs How-to Posts.... )


Diese Message-Funktionen stehen in einer DLL der API bereit, und Programme wie zum Beispiel
AutoHotkey oder nircmd greifen darauf zu und bieten eine einfache Syntax zum Aufrufen an.
AutoHotkey -Beispiel: SendMessage, Msg , wParam, lParam, , WinTitle
nircmd Beispiel: nircmd.exe win sendmsg window Msg, wParam, lParam

Bei einigen Skriptsprachen kann man mittels "DllCall()" auf diese Funktionen zugreifen.
mehr...
DllCall("SendMessage", UInt, hMIC, UInt, WM_IME_CONTROL, Int, wParam, Int, lParam)

Auch bei AutoHotkey war es früher etwas umständlicher, eine Message zu senden:

by *SanskritFritz » Tue May 17, 2005 9:52
So, a long awaited feature is here:
Result := DllCall("DllFile\Function" , Type1, Arg1, Type2, Arg2, "Cdecl ReturnType")
https://www.autohotkey.com/docs/commands/DllCall.htm

$hwnd = WinGetHandle("Total Commander")
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwnd , "int" , 1075 , "int", 2903 )

1075 is WM_USER+51
2903 is taken from totalcmd.inc

1075 is the message identifier, the 2903 is the parameter from the Windows point of view.
From TC point of view, 1075 is the message used to send commands to TC, whereas the parameter is the cm_VisTwoDriveButtons command you can find in the TOTALCMD.INC file.
By changing the parameter you can send different commands to TC, but when you change the message constant, TC will do nothing if you are lucky,
or something strange depending on the message it tries to interpret. You can even freeze an application by sending some messages to them.

It is common for windows applications to define user defined messages, and Microsoft recommends that the values should be above the WM_USER constant.
Ghisler simply defined his message as WM_USER+51, much like Douglas Adams his 42.
Bei "richtigen" Programmiersprachen...
Bei "richtigen" Programmiersprachen muss man noch etwas mehr dafür tun:

Code: Select all

Win32 Messages
Sende eine Message mit Visual Basic 6 an die Win32 API 

Win32 Messages function: 
SendMessage(hWnd, wMsg, wParam, IParam) 

Visual Basic function:
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Aufruf dieser Funktion: 
    Dim lres as Long
    Dim wp as Long
    Dim lp as Long
    wp = some_valid_value
    lp = some_valid_value
    lres = SendMessage(hWnd, messageID, wp, lp)




Grundsetzlicher Aufruf einer Message:
SendMessage(
HWND hWnd, // Das Handle des Empfänger-Fensters
UINT Msg, // Die Nachricht-ID, damit der Empfänger weiß, das die Nachricht für ihn ist, und wofür.
WPARAM wParam, // Erster Parameter zur Nachricht-ID
LPARAM lParam // Zweiter Parameter
);

Siehe
Docs \ Windows \ Desktop \ API \ Windows Controls \ Winuser.h \ SendMessage function
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage

Docs \ Windows \ Desktop \ Windows and Messages \ Messages and Message Queues
\ Message and Message Queue Overviews \ About Messages and Message Queues
https://docs.microsoft.com/de-de/windows/desktop/winmsg/about-messages-and-message-queues

Mr. Ghisler im Wiki:
http://www.ghisler.ch/wiki/index.php/TCUtils.cpp



Details der Message-Syntax:

Bei UINT kann man zB für private Nachrichten den Wert von WM_USER (=1024)
plus ein selbst gewählten Wert zur Eindeutigkeit eintragen (WM_USER+x)
Zur Kommunikation zwischen Anwendungen würden man hier zB WM_APP (=32768)+x verwenden.

Siehe
Docs \ Windows \ Desktop \ Windows and Messages \ Messages and Message Queues \ Message Reference \ Message Constants \ WM_USER
https://docs.microsoft.com/de-de/windows/desktop/winmsg/wm-user


Ein Typ solcher Nachrichten für UINT ist "WM_COPYDATA" (0x004A) um Zeichenketten auszutauschen.
Siehe "List of Windows Messages - Win32" : zB bei https://en.wikichip.org/wiki/List_of_Windows_Messages_-_Win32


Damit der TC weiß, das dies eine "WM_COPYDATA"-Nachrichten für ihn ist,
hat Herr Ghisler sich den Wert von WM_USER+50=1074 als Nachricht-ID für "WM_COPYDATA an den TC" ausgedacht.

Wenn der TC eine Nachricht "1074" (bzw. x432) erhält, weiß er das die für ihn ist und "WM_COPYDATA mit WPARAM" bedeutet.


Bei WPARAM und LPARAM muss man die Werte verwenden, welche der Entwickler des Empfängerprogramms vorgibt.

Offiziell laut https://docs.microsoft.com/de-de/windows/desktop/winmsg/about-messages-and-message-queues
wParam: A handle to the window passing the data.
lParam : A pointer to a COPYDATASTRUCT structure that contains the data to be passed.
Der Typ "COPYDATASTRUCT" hat ebenfalls Parameter: "dwData", "cbData" und "lpData", aber die werden hier nicht verwendet.

Weitere Infos zu WM_COPYDATA und COPYDATASTRUCT
eine Zeichenkette von einer Anwendung in die andere übertragen

https://docs.microsoft.com/de-de/previous-versions/technical-content/bb978969%28v=msdn.10%29

Wie COneInstance (Name der Funktion vom Autor dieses Artikels) die andere Instanz der Anwendung mit Hilfe von FindWindow
und der Identifizierungsnachricht aufspürt, habe ich bereits beschrieben.
Aber wie bringt sie diese andere Instanz dazu, eine neue Datei zu öffnen?
Auf den ersten Blick bietet es sich an, eine weitere WM-Nachricht zu definieren und den Dateinamen als LPARAM zu übergeben.
Leider hat die Sache einen kleinen Schönheitsfehler: man kann keine Zeiger von einen Prozess an den anderen weitergeben.
Im fremden Adressraum hätte der Zeiger keine Bedeutung.

Zum Glück bietet Windows aber eine Nachricht an, mit deren Hilfe
sich eine Zeichenkette von einer Anwendung in die andere übertragen lässt: WM_COPYDATA.
Sie füllen eine kleine Struktur aus, die natürlich COPYDATASTRUCT heißt, und übergeben diese Struktur via LPARAM.
Windows kopiert Ihre Daten in den Adressraum des anderen Prozesses und schon kann dieser Prozess die Daten lesen.

Beim Total Commander wird dies so verwendet:
WPARAM: die Nummer des TC-internen Befehls (siehe TOTALCMD.INC).
LPARAM : eine '0' (Ziffer Null)



TESTs

Als Beispiel Skript-Programm verwende ich hier AutoHotkey .
(http://www.ghisler.ch/wikide/index.php/AutoHotkey)

Bei AutoHotkey ist die Syntax etwas anders aufgebaut als oben gezeigt:
PostMessage, Msg , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
SendMessage, Msg , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout]

AutoHotkey -Beispiel:
SendMessage, Msg , wParam, lParam, , WinTitle,
SendMessage 1074, 1000, 0, , ahk_class TTOTAL_CMD


Für andere Anwendungen kann man zB so etwas verwenden:
PostMessage, 0x111, 18808,0,, ahk_class abcdef
; 0x111 ist WM_COMMAND, 18808 ist die Anweisung/der Befehl, welcher das Empfängerprogramm versteht.


---

Bei NirSofts' nircmd wäre es so:
nircmd.exe win sendmsg [find] [window to find] [Additional Parameters: Msg, wParam, lParam]
nircmd.exe win sendmsg window to find Msg, wParam, lParam
nircmd.exe win sendmsg class TTOTAL_CMD 1074, 1000 , 0


---





Genug der Theorie, probieren wir es aus, hier sind verschiedene Möglichkeiten als Beispiele
(unter dem "mehr"-Spoiler findest du die komplette Liste)




---


- - - Fernsteuern des TCs

SendMessage "WM_COPYDATA" an "WM_User+50" (=1074)



Send WM_USER+50 with WPARAM set to (Left/Right)

History.txt
; 08.06.16 Added: Send WM_USER+50 with WPARAM set to (Left/Right)
1005/1006 to get total number of selected items
1003/1004 to get total number of items (including those hidden by quick filter


Anwendungsbeispiel mit AutoHotkey:
SendMessage 1074, 1004, 0, , ahk_class TTOTAL_CMD
vTotal = %ErrorLevel%
SendMessage 1074, 1006, 0, , ahk_class TTOTAL_CMD
MsgBox Answer from TC, total number of selected items : %ErrorLevel% out of %vTotal%


;1011/1012 (Left/Right) to get index of first file in list (get a '-1' if there are no files)
SendMessage 1074 , 1011, 0, , ahk_class TTOTAL_CMD
vFolders := % (ErrorLevel - 1)
MsgBox First file is on Pos. %ErrorLevel% (So there must be %vFolders% folders before)
mehr...
History.txt 9b1 wrote:
08.06.16 Added:
Send WM_USER+50 with WPARAM set to
1011/1012 to get index of first file in list (-1 if there are no files)
1009/1010 to get index of first item (0 if there is no updir, 1 otherwise)
1007/1008 to get index of current item (caret)
1005/1006 to get total number of selected items
1003/1004 to get total number of items (including those hidden by quick filter
1001/1002 to get number of items in left/right list
1000 to get active panel: 1=left, 2=right

Code: Select all

;Test with AHK-L v1.1.22.09 on Win7/32 with TC9beta2 32-Bit
#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win-A
	;TC v9: WM_USER+50 = 1074  ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	vMsg = 1074 ;WM_USER+50

	;Left/Right
	;1011/1012 to get index of first file in list (-1 if there are no files)

	vWParam = 1011
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	vFolders := % (ErrorLevel - 1)
	MsgBox ErrorLevel of wParam %vWParam% (Left):`nFirst file is on Pos. %ErrorLevel%`n(So there are %vFolders% folders)


	vWParam = 1012
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	vFolders := % (ErrorLevel  - 1)
	MsgBox ErrorLevel of wParam %vWParam% (Right):`nFirst file is on Pos. %ErrorLevel%`n(So there are %vFolders% folders)

Return
###

Code: Select all

;Test with AHK-L v1.1.22.09 on Win7/32 with TC9beta2 32-Bit
#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win-A
	;TC v9: WM_USER+50 = 1074  ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	vMsg = 1074 ;WM_USER+50

	;Left/Right
	;1009/1010 to get index of first item (0 if there is no updir, 1 otherwise) 
	;ATTENTION : Depends on "Configuration > Display > [X]Show .. in root"
	;Check WINCMD.ini > [Configuration] > ShowParentDirInRoot=1" first to decide

	vWParam = 1009
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	if( ErrorLevel = 1 )
		vUpDir = Yes
	else
		vUpDir = No
	MsgBox ErrorLevel of wParam %vWParam% (Left):`nIndex of first item is %ErrorLevel%`n(So is there an up dir?: %vUpDir%)


	vWParam = 1010
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	if( ErrorLevel = 1 )
		vUpDir = Yes
	else
		vUpDir = No, you are in the root of an drive
	MsgBox ErrorLevel of wParam %vWParam% (Right):`nIndex of first item is %ErrorLevel%`n(So is there an up dir?: %vUpDir%)

Return
###

Code: Select all

;Test with AHK-L v1.1.22.09 on Win7/32 with TC9beta2 32-Bit
#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win-A
	;TC v9: WM_USER+50 = 1074  ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	vMsg = 1074 ;WM_USER+50

	;Left/Right
	;1007/1008 to get index of current item (caret, not necessarily the selected one)
	;ATTENTION if in root: index is minus one (Index of first item is'0')
	;Depends on "Configuration > Display > Show .. in root"
	;Check with wParam 1009/1010 first.

	vWParam = 1007
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	MsgBox ErrorLevel of wParam %vWParam% (Left):`nIndex of current item is %ErrorLevel%

	vWParam = 1008
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	MsgBox ErrorLevel of wParam %vWParam% (Right):`nIndex of current item is %ErrorLevel%

Return
###

Code: Select all

;Test with AHK-L v1.1.22.09 on Win7/32 with TC9beta2 32-Bit
#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win-A
	;TC v9: WM_USER+50 = 1074  ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	vMsg = 1074 ;WM_USER+50

	;Left/Right
	;1005/1006 to get total number of selected items (folder and files)
	;1003/1004 to get total number of items (including those hidden by quick filter)

	vWParam = 1005
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	MsgBox ErrorLevel of wParam %vWParam% (Left):`nTotal number of selected items: %ErrorLevel%

	vWParam = 1006
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	MsgBox ErrorLevel of wParam %vWParam% (Right):`nTotal number of selected items: %ErrorLevel%
Return
###

Code: Select all

;Test with AHK-L v1.1.22.09 on Win7/32 with TC9beta2 32-Bit
#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win-A
	;TC v9: WM_USER+50 = 1074  ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	vMsg = 1074 ;WM_USER+50

	;Left/Right
	;1001/1002 to get number of items in left/right list
	;ATTENTION : number is including the .. up dir!
	;Check with wParam 1009/1010 first: if(ErrorLevel=1) THEN NumberOfItems = NumberOfItems-1

	vWParam = 1001
	SendMessage %vMsg%, 1009, 0, , ahk_class TTOTAL_CMD
	vUpDir = %ErrorLevel%
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	MsgBox % "ErrorLevel of wParam" vWParam "(Left):`nNumber of items: " (ErrorLevel - vUpDir)

	vWParam = 1002
	SendMessage %vMsg%, 1010, 0, , ahk_class TTOTAL_CMD
	vUpDir = %ErrorLevel%
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	MsgBox % "ErrorLevel of wParam" vWParam "(Right):`nNumber of items: " (ErrorLevel - vUpDir)
Return
###

Code: Select all

;Test with AHK-L v1.1.22.09 on Win7/32 with TC9beta2 32-Bit
#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win-A
	;TC v9: WM_USER+50 = 1074  ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	vMsg = 1074 ;WM_USER+50

	;1000 to get active panel: 1=left, 2=right
	vWParam = 1000
	SendMessage %vMsg%, %vWParam%, 0, , ahk_class TTOTAL_CMD
	if(ErrorLevel=1)
		vActivePanel = Left (or the Upper)
	else
		vActivePanel = Right (or the Lower)
	MsgBox ErrorLevel of wParam %vWParam%: %ErrorLevel%,`nthat means the %vActivePanel% panel is currently the active one.
Return
###


- - - Fernsteuern des TCs

Send WM_USER+50 with wparam=1..29 -> gibt die ID des Controls zurück.



History.txt
08.06.16 Added: Send WM_USER+50 with wparam=1..29 -> returns window handle of control.

Bei TC9 kann man neu eine Message wm_user+50 an das Hauptfenster schicken,
um das Window-Handle eines Dialogelements zurückzuerhalten.
Dazu muss WPARAM auf einen der folgenden Werte gesetzt werden:
1=leftlist, 2=rightlist, usw... 21=curdirpanel, ... siehe History.txt

Als Antwort erhält man in AHK als ErrorLevel quasi die Hausnummer, die momentane ID des angefragten Controls.
Diese ID muss man jedes mal neu ermitteln, und kann dies dann in Folge verwenden.

Anwendungsbeispiel mit AHK:
SendMessage 1074, 21, 0, , ahk_class TTOTAL_CMD
MsgBox ErrorLevel bzw. Control-ID: %ErrorLevel% ; e.g.: 7014276
ControlGetText, var_curDirPanel, , ahk_id %ErrorLevel%
MsgBox Pfad im aktiven Fenster: %var_curDirPanel%
mehr...
History.txt 9b1 wrote:
08.06.16 Added: Send WM_USER+50 with wparam=1..29 -> returns window handle of control.
Controls are:
1=leftlist
5=leftheader
7=leftsize
9=leftpath
11=leftinfo
13=leftdrives
15=leftpanel
18=lefttree
24=leftdrivepanel
26=lefttabs

2=rightlist
6=rightheader
8=rightsize
10=rightpath
12=rightinfo
14=rightdrives
16=rightpanel
19=righttree
25=rightdrivepanel
27=righttabs

3=active list
4=inactive list
21=curdirpanel
22=inplaceedit
23=splitpanel
28=buttonbar
29=buttonbarvertical
17=bottompanel
20=cmdline

Bei TC9 kann man neu eine Message wm_user+50 an das Hauptfenster schicken,
um das Window-Handle eines Dialogelements zurückzuerhalten.
Dazu muss WPARAM auf einen der folgenden Werte gesetzt werden: (siehe oben "Controls are:")

Das Panel mit dem aktuellen Verzeichnis ist curdirpanel, das ist Nummer 21.
Also muss man aufrufen:
SendMessage 1074, 21, 0, , ahk_class TTOTAL_CMD

Das Resultat sollte dann in %ErrorLevel% stecken.

TEST mit AHK-L v1.1.22.09:

Code: Select all

#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD
$#a::	;press shortcut Win+A
	;TC v9: WM_USER+50 = 1074 ;See Hstory.txt "08.06.16 Release Total Commander 9.0 beta 1"
	SendMessage 1074, 21, 0, , ahk_class TTOTAL_CMD
	MsgBox ErrorLevel: %ErrorLevel%     ; e.g.: 7014276 
        ;(The controls' current ID, a random number, valid for the time being, will change on next situation)

	;ControlGetText, OutputVar [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
	;To operate upon a control's HWND (window handle), leave the Control parameter blank 
	;and specify <<<ahk_id %ControlHwnd%>>> for the WinTitle parameter
	ControlGetText, varPathInTC, , ahk_id %ErrorLevel%

	StringReplace, varPathInTC, varPathInTC, >, \
	MsgBox PATH curdirpanel: %varPathInTC% 
Return



- - -

Weitere Einzelheiten, gefunden im Forum:

mehr zu WM_COPYDATA ...

17.09.06 Added:
Send WM_COPYDATA with dwData='E'+256*'M' and lpData pointing to em_xyz internal command (0-terminated) to execute that command.
Accepts parameters separated by a space

Support for environment variables in paths received via WM_COPYDATA from other programs


25.11.11 Added:
Send WM_COPYDATA with dwData='G'+256*'A' and lpData pointing to command to get back WM_COPYDATA with various info.
Supported commands A: Active side (returns L or R),
or two byte command: first byte: L=left, R=right, S=source, T=target.
Second byte: P=current path, C=list count, I=caret index, N=name of file under caret.
dwData of return is 'R'+256*'A' (32/64)

25.11.11 Added:
Send WM_COPYDATA with dwData='G'+256*'W':
Same as with 'G'+256*'A', but data is returned as UTF-16 Unicode.
dwData of return is 'R'+256*'W' (32/64)
ghisler(Author) wrote: 2009-04-17, 18:37 UTC Indeed many controls are Unicode now, and then they have the .UnicodeClass suffix in the class name.

WM_COPYDATA can now accept Unicode names.
To send a Unicode name, send it in UTF-8,
and put a UTF-8 byte order marker in front of the name.
(as Notepad creates it when saving as UTF-8)
When passing two paths to TC, both are treated separately and can or cannot have the UTF-8 prefix.
by *ghisler(Author) » Wed May 16, 2012 16:47
viewtopic.php?p=248335#p248335
Ja, das läuft über WM_COPYDATA - der einzigen Windows-Message, bei der man grössere Datenmengen übergeben kann

Ja, über den Parameter "flags" im verlinkten Beispiel. Die Flags sind:
S Parameter sind Source/Target statt Links/Rechts
T Verzeichnisse in neuem Tab öffnen und aktivieren
B Verzeichnisse in neuem Tab öffnen im Hintergrund (background)
L oder R: Linkes bzw. rechtes Panel aktivieren

Leider gibt es z.Zt. nicht mehr, als im Wiki steht.
Eigentlich wird das vor allem vom TC intern benutzt, wenn man ihn mit dem Parameter /O startet un weitere Parameter übergibt.
Er sendet dann diese Parameter mit WM_COPYDATA an den bereits laufenden.
by *nsp » Fri Oct 19, 2012 9:34
viewtopic.php?p=256751#p256751
The complete syntax is in fact :
<Left>\r<Right>\0
<Source>\r<Target>\0S
<Left>\r<Right>\0T open in new Tab
If you only need to open in current source tab you can define a user command em_cd with command cd AND %A As parameter;
After, you can use your em_cd like sending em_cd D:\MyFolder it will also allows you to add filter like em_cd *.ini *.reg *.key
by *MVV » Sat Dec 12, 2009 20:22
MVV wrote: 2009-12-12, 18:22 UTC eitang, I will describe for you how it works:

1. define array of char and write to it following sequence of items:
> path to left dir
> (optional) #10 char and path to right dir
> (optional) #0 char and flags ('T', 'S' or 'ST')
e.g. you may write following chars to buffer: 'c', ':', '\', #10, 'd', ':', '\', #0, 'T' (9 chars total) - this will open C:\ and D:\ dirs in left and right panels in new tabs.

2. define struct COPYDATASTRUCT (perhaps in Delphi it will have name TCOPYDATASTRUCT) and set it fields to:
> dwData to ord('C') + 256 * ord('D')
> cbData to ammount of bytes used in defined buffer for all written information
> lpData to pointer to first char of buffer

3. use Windows function SendMessage with following parameters:
> handle of TC window
> WM_COPYDATA message
> 0
> pointer to defined TCOPYDATASTRUCT
ghisler(Author) wrote: 2019-03-13, 08:16 UTC
post by *ghisler(Author) » Wed Mar 13, 2019 9:16
Re: HowTo open Dirs in new Tab (WM_COPYData - AutoHotkey)

I have checked what Total Commander receives:
It receives the first path, then character #13 (not 0x13, 0x0D),
then the second path, then #0, then #2 (0x02) and then again 0x00.

The following works for me:

Code: Select all

	NumPut( Asc(SubStr(Type,1,1)) ,(A_IsUnicode ? cmdA : cmd),StrLen(cmd)+1,"Char")
	NumPut( Asc(SubStr(Type,2,1)) ,(A_IsUnicode ? cmdA : cmd),StrLen(cmd)+2,"Char")
The meaning of the placeholders is:
S: Interpret the paths as source/target instead of left/right
T: Open path(s) in new tabs
B: Open tabs in background (do not activate them)
L: Activate the left panel
R: Activate the right panel
A: Do not open archives as directories. Instead, open parent directory and place cursor on it.
TC accepts more then 2 parameters here, so sending e.g. STBL is legitimate.

Unicode can be handled by sending either UTF-8 or UTF-16 text WITH byte order marker (BOM).
Both paths MUST be preceded by the BOM.
Only Intel word order is supported for UTF-16 (bom=FF FE).




Test AHK-Skript by artt / send em_commands
(etwas angepasst durch mich)

Code: Select all

;//https://ghisler.ch/board/viewtopic.php?f=6&t=32658&start=30
;//New WM_COPYData Examples
;//
;//
;//
;//artt	     Junior Member     Junior Member	     Posts: 39	     Joined: Sun May 03, 2009 9:03	 
;//Post by *artt » Thu Apr 23, 2015 8:05
;//Just another working AHK script
;//TESTED AND WORKING ON: AHK_L v1.1.21.03 UNICODE X32 + Win7 X32 + TC 8.51a

#SingleInstance force
msgbox Press F12 to start

;My settings for the commands:
EM	    = em_RunNotepad|em_OpenTCFolder|em_foo ;|em_APPENDTABS C:\tc\tabs\TC Select.tab
ASK	    = A|LP|LC|LI|LN|RP|RC|RI|RN|SP|SC|SI|SN|TP|TC|TI|TN
Dir1	= C:\temp\
Dir2	= C:\windows\
Return


F12::
i:=""
LOOP, PARSE, ASK, |	; Ask TC
	i .= A_LoopField ":`t" TC_SendData(A_LoopField) (A_Index=1 OR A_Index=5 OR A_Index=9 OR A_Index=13 ? "`n`n" : "`n")
MsgBox,4096, Ask TC, % i



MsgBox,4096, Executing now: CD Command, LeftDir - RightDir`n%Dir1% # %Dir2%
TC_SendData(Dir1 "`r" Dir2, "LR")

MsgBox,4096, Executing now: CD Command, SourceDir`n%Dir1%
TC_SendData(Dir1 "`r", "ST")

MsgBox,4096, Executing now: CD Command, TargetDir`n%Dir2%
TC_SendData("`r" Dir2, "ST")

MsgBox,4096, Executing now: CD Command, LeftDir`n%Dir1%
TC_SendData(Dir1 "`r", "LR")

MsgBox,4096, Executing now: CD Command, RightDir`n%Dir2%
TC_SendData("`r" Dir2, "LR")

MsgBox,4096, Executing now: CD Command, SourceDir -  TargetDir`n%Dir1% # %Dir2%
TC_SendData(Dir1 "`r" Dir2, "ST")


LOOP, PARSE, EM, |	; User Command
	{
	MsgBox,4096, Executing now User Command, %A_LoopField%
	TC_SendData(A_LoopField,"EM")
	}


EXITAPP
;Return


/*
TESTED AND WORKING ON: AHK_L v1.1.21.03 UNICODE X32 + Win7 X32 + TC 8.51a
-------------------------------------------------------------------------
TC_SendData("em_FOO"         	     , "EM") ; User Command
TC_SendData("em_APPENDTABS C:\my.tab", "EM") ; User Command with parameters (usercmd.ini as following)
															;				[em_APPENDTABS]
															;				cmd=APPENDTABS
															;				param=%A

TC_SendData("cmd") 								  ; Ask TC :     (cmd one of the following varues:)
															; A  = Active Side
						
															; LP = Left Path            RP = Right Path
															; LC = Left List Count      RC = Right List Count
															; LI = Left Caret Index     RI = Right Caret Index
															; LN = Left Name Caret      RN = Right Name Caret

															; SP = Source Path          TP = Target Path
															; SC = Source List Count    TC = Target List Count
															; SI = Source Caret Index   TI = Target Caret Index
															; SN = Source Name Caret    TN = Target Name Caret

TC_SendData("C:\tc" "`r" "D:\data", "LR")	 ; CD   Command: (LeftDir - RightDir)
TC_SendData("C:\tc" "`r"          , "LR")	 ; CD   Command: (LeftDir)
TC_SendData(        "`r" "D:\data", "LR")	 ; CD   Command: (          RightDir)

TC_SendData("C:\tc" "`r" "D:\data", "ST")	 ; CD   Command: (SourceDir - TargetDir)
TC_SendData("C:\tc" "`r"          , "ST")	 ; CD   Command: (SourceDir)
TC_SendData(        "`r" "D:\data", "ST")	 ; CD   Command: (            TargetDir)
*/



TC_SendData(Cmd, CmdType="", msg="", hwnd="") {
   Critical   ; Define "OnMessage" as STATIC it is registered at Script startup.
   STATIC om:=OnMessage(0x4a, "TC_SendData"), TC_ReceiveDataValue:="", TC_DataReceived:=""	; 0x4a is WM_COPYDATA

   IF ((msg=0x4A) AND (hwnd=A_ScriptHwnd)) ; EnSure is trigered by this Script.
      EXIT (TC_ReceiveDataValue:=StrGet(NumGet(CmdType + A_PtrSize * 2)), TC_DataReceived:="1")

   VarSetCapacity(CopyDataStruct, A_PtrSize * 3), TC_ReceiveDataValue:=1, TC_DataReceived:=""
   IF CmdType IN LR,ST			; CD   Command
	DirType:=CmdType, CmdType:="CD"
   ELSE IF (CmdType="")			; Ask TC
	CmdType:=(A_IsUnicode ? "GW" : "GA"), TC_ReceiveDataValue:=""

   If( A_IsUnicode ) {
      VarSetCapacity( cmdA, StrPut(cmd, "cp0"),0) ; 3rd parameter "0" is necessary for CD "LeftPath only"
      Loop, % StrLen(cmd)
         NumPut( Asc(SubStr(cmd, A_Index, 1)), cmdA, A_Index - 1, "Char")
   }
   NumPut( Asc(SubStr(CmdType,1,1)) + 256 * Asc(SubStr(CmdType,2,1)), CopyDataStruct,0 )
   NumPut( StrLen(cmd) + (CmdType="CD" ? 5 : 0), CopyDataStruct, A_PtrSize )
   NumPut((A_IsUnicode ? &cmdA : &cmd), CopyDataStruct, A_PtrSize * 2)
   Loop, % (CmdType=="CD" ? 2 : 0)
      NumPut(Asc(SubStr(DirType,A_Index,1)), (A_IsUnicode ? cmdA : cmd), (StrLen(cmd)+A_Index),"Char")
   SendMessage, 0x4A,%A_ScriptHwnd%, &CopyDataStruct,, ahk_class TTOTAL_CMD


;IF you send a 'request' command to TC (all Ask TC commands: A, LP, LC, ...), script is waiting for (500 x 10 = 5000ms = 5 seconds) for TC to response/answer.
;If the answer arrives before the 5 seconds, it is immediately breaking the interaction and return the answer to the user (normally their is no delay).
   While (TC_ReceiveDataValue="") {
      IfEqual, TC_DataReceived,    1, Break
      IfGreaterOrEqual, A_Index, 500, Break
      Sleep,10
   }
   Return TC_ReceiveDataValue
}



;//    FIXED at 20150425:
;//    When you send an "ASK TC" command and the value returned by TC is an "empty" string (as if you send "SP" and the source panel contains a search results list), it will not wait for 5 seconds for the empty value to be returned to the user. (Thanks LonerD for your report)
;//
;//    FIXED at 20150426:
;//    Restored the missing comments about the syntax of CD command, that were lost during last post modification! (Thanks LonerD for your report)
;//
;//Last edited by artt on Sun Apr 26, 2015 7:42, edited 3 times in total. 

SendMessage TC_SendWMCopyData by Balderstrom.ahk

Code: Select all

;https://ghisler.ch/board/viewtopic.php?t=32658
;New WM_COPYData Examples
;Post by *Balderstrom » Sun Nov 27, 2011 21:39 

;SendMessage TC_SendWMCopyData by Balderstrom.ahk

;;
;; AutoHotkey_L Function
;;     cmdType: "CD" or "EM"
;;     cmd(1): name of user command, e.g. em_FOO
;;     cmd(2): formatted string with path's to CD to,
;;                  e.g. "C:\`rC:\Users"
;;     addParams: for CD only, e.g. ST, S, T


; My Notes:
;Note parameter #2: cmd, is a byRef - it has to be a variable.
;So you call it like this:
;TC_SendWMCopyData("EM", gCmd:="em_test", gNul:="", "ahk_class TTOTAL_CMD") 
;TC_SendWMCopyData ("EM", gCmd:="em_RunNotepad", gNul:="", "ahk_class TTOTAL_CMD") 

;But I use a higher-level function to call into TC_SendWMCopyData
; I always call it with caller functions, like TC_EMC(), TC_CMD() and TC_CD() 
;TC_EMC( cmd, wID="ahk_class TTOTAL_CMD")
;
;So you would do:
;TC_EMC("em_RunNotepad")

;My Tests:
;[em_RunNotepad]
;cmd=notepad
TC_EMC("em_RunNotepad")
;
;[em_OpenTCFolder]
;cmd=explorer %Commander_Path%
TC_EMC("em_OpenTCFolder")
;// End Notes



TC_SendWMCopyData( cmdType, byRef cmd, byRef addParams="", aWin="A" )
{
Critical
	VarSetCapacity( CopyDataStruct, A_PtrSize * 3 )
	if( A_IsUnicode )
	{
		VarSetCapacity( cmdA, StrPut(cmd, "cp0"))
		Loop, % StrLen(cmd)
			NumPut( Asc(SubStr(cmd, A_Index, 1)), cmdA, A_Index - 1, "Char")
	}
	NumPut( Asc(SubStr(cmdType,1,1)) + 256 * Asc(SubStr(cmdType,2,1)), CopyDataStruct )
	NumPut( StrLen(cmd) + (cmdType="CD" ? 5 : 1), CopyDataStruct, A_PtrSize )
	NumPut((A_IsUnicode ? &cmdA : &cmd), CopyDataStruct, A_PtrSize * 2)
	
	Loop, % (cmdType=="CD" ? 2 : 0)
		NumPut( Asc(SubStr(addParams, A_Index, 1)), (A_IsUnicode ? cmdA : cmd), (StrLen(cmd) + A_Index), "Char" )
	SendMessage, 0x4A,, &CopyDataStruct,, ahk_id %aWin%
return
}



TC_EMC( cmd, wID="ahk_class TTOTAL_CMD", activateWin=FALSE, showMsg=FALSE )
{
	TC_Activate( wID, activateWin, showMsg, cmd )
	TC_SendWMCopyData( "EM", cmd, params:="", wID )
return
}

;## TC_CD() is a neat piece of code, but it pretty much requires a LIB.ahk as it uses a fair number of defined functions, not really pasteable here.

TC_CD@( wID, src="", trg="", params="", activateWin=TRUE )
{
	if( activateWin )
		WinActivate, % ( wID+0 ? "ahk_id " wID : wID )
	TC_SendWMCopyData( "CD", cmd:=(src " `r" trg " "), params, wID )
return
}

TC_Activate( byRef wID, activateWin=TRUE, showMsg=TRUE, cmd="" )
{
	wID:=QueryWinID(wID, TRUE)
	if(!activateWin )
		return FALSE
	if( showMsg )
		MsgBox,,%A_ThisFunc%, % "Activating TC" ( cmd ? ", for command: " cmd "`n" : "`n"), 1
	WinActivate, ahk_id %wID%
return TRUE
}

QueryWinID( aWin="A", canExist=FALSE, winText="", notTitle="", notText="" )
{
	if( !(retVal:=WinActiveA( aWin, winText, notTitle, notText )) )
		retVal:=( !canExist ? 0 : WinExistA( aWin, winText, notTitle, notText ))
return retVal
}

WinActiveA( aWin="", winText="", notTitle="", notText="" )
{
	return WinActive( (aWin+0 ? "ahk_id " aWin : aWin), winText, notTitle, notText )
}

WinExistA( aWin="", winText="", notTitle="", notText="" )
{
	return WinExist( (aWin+0 ? "ahk_id " aWin : aWin), winText, notTitle, notText )
}

;###
;https://ghisler.ch/board/viewtopic.php?p=256687#p256687
;New WM_COPYData Examples
;by *Balderstrom » Thu Oct 18, 2012 0:03 

TC_CMD( cmd, wID="ahk_class TTOTAL_CMD", activateWin=FALSE, post=TRUE, showMsg=FALSE )
{
	TC_Activate( wID, activateWin, showMsg, cmd )
	if( !post )
		SendMessage, 0x433, TC_@( cmd ), 0x0,, ahk_id %wID%
	else
		PostMessage, 0x433, TC_@( cmd ), 0x0,, ahk_id %wID%
return TRUE
}

TC_@( cm_cmd="" )
{
	static
	static init := 0
	global TC__TotalCmd@INC
	local iCmd, iCmd1, iCmd2, iCmd3, iTmp, retVal, tmpVar

	if( !init && init := 1 && !ErrorLevel:="")
	{
		local aDrive, aFile, aPath
		if(!(aPath:=TC__TotalCMD@INC))
		{
			EnvGet, aPath, COMMANDER_PATH
;			MsgBox, TC__TotalCmd@INC: %TC__TotalCmd@INC%
			if( !aPath )
			{
				EnvGet, aDrive, SystemDrive
				if(!FileExist(aPath:=aDrive "\TotalCmd"))
					if(!FileExist(aPath:=ProgramFiles "\TotalCMD"))
						aPath:=ProgramFiles
				FileSelectFile, TC__TotalCmd@INC,, %aPath%,Location of TotalCMD.inc file?,*.inc
			}
			else
				TC__TotalCmd@INC:=aPath "\TotalCMD.inc"
		}
;		MsgBox, TC__TotalCmd@INC: %TC__TotalCmd@INC%
;		MsgBox, aPath: %aPath%
		SplitPath( TC__TotalCmd@INC, aFile )
;		MsgBox, aFile: %aFile%`nErrorLevel: %ErrorLevel%
		onErrorExit((ErrorLevel || !RegExMatch( aFile, "i)^TotalCMD.inc$")) && !(init:=0), "ERROR: Invalid TotalCMD.inc File.")
		FileRead, TcmdINC, %TC__TotalCmd@INC%
		Loop, Parse, TcmdINC, `n, `r
		{
			if( !regExMatch( A_LoopField, "^cm_([a-zA-Z]+)([0-9]+)?=([0-9]+);", iCmd ) )
				continue
			if( iCmd3 > 6000 && iCmd3 <= 20000)
				continue
			if( iCmd3 > 5000 && iCmd3 <= 5500)
				continue
			else
			if( iCmd3 > 2060 && iCmd3 <= 2120 )	; cm_GotoDriveA ...
				continue
			else
			if( iCmd3 >= 701 && iCmd3 <= 900 )	; cm_UserMenu1 ... cm_UserMenu300
				continue
			else
			if( iCmd3 >= 271 && iCmd3 <= 299 )	; cm_SrcCustomView1 - 29
				continue
			else
			if( iCmd3 >= 171 && iCmd3 <= 199 )	; cm_RightCustomView1 - 29		
				continue
			else
			if( iCmd3 >=  71 && iCmd3 <= 99 )	; cm_LeftCustomView1 - 29
				continue

			tmpVar = cm_%iCmd1%%iCmd2%
			StringUpper, tmpVar, tmpVar
			%tmpVar% := iCmd3
		}
		if( !cm_cmd )
			return
	}

	Sleep, 50
	if( !cm_cmd )
		return
;	if(  )
	onErrorExit( !inStr( cm_cmd, "cm_"), "UnSupported: Input must be a `cm_` string." cm_cmd ": " %cm_cmd%, A_ThisFunc )

	StringUpper, cm_cmd, cm_cmd
	if( retVal := %cm_cmd% )
		return retVal

	if( RegExMatch( cm_cmd, "^CM_(LEFT|RIGHT|SRC)(CUSTOMVIEW)(\d+)$", iCmd ) )
	{
		onErrorExit( ( iCmd3 < 1 || iCmd3 > 29 ), "Illegal value for: " cm_cmd, A_ThisFunc )
		
		local LEFT := 0, RIGHT := 100, SRC := 200
	return % ( %iCmd1% + iCmd3 + 70 )
	}	  

	if( RegExMatch( cm_cmd, "^(CM_)(USERMENU)(\d+)$", iCmd ) )
	{
		onErrorExit( ( iCmd3 < 1 || iCmd3 > 200 ), "Illegal value for: " cm_cmd, A_ThisFunc )
	return ( iCmd3 + 700 )
	}
	
	if( RegExMatch( cm_cmd, "CM_(LEFT|RIGHT|SRC|TRG)(ACTIVATETAB|SORTBYCOL)(\d+)", iCmd ) )
	{
		onErrorExit( ( iCmd3 < 1 || iCmd3 > 99 ), "Illegal value for: " cm_cmd , A_ThisFunc )
		local SRC := 0, TRG := 100, LEFT := 200, RIGHT := 300
		local ACTIVATETAB := 5000, SORTBYCOL := 6000
	return % ( %iCmd1% + %iCmd2% + iCmd3 )
	}
	
	if( RegExMatch( cm_cmd, "(CM_)(GOTODRIVE)([A-Z])", iCmd ) )
	{
	return ( ASC(iCmd3) + 2000	-4 )
	}
	;onErrorExit( TRUE, "Variable: " cm_cmd " doesn't exist!", A_ThisFunc )
}

onErrorExit( checkEval, errMsg="", fn="", delay=3 )
{
	if( !checkEval )
		return 0
	if((!ErrorLevel || ErrorLevel:=1) && !errMsg)
		Exit
	RegExMatch(fn, "^([^:]+)(::([^ ].*))?$", rTmp )
	msg := ( rTmp1 ? rTmp1 "(" rTmp3 "): " : "" ) errMsg
	MsgBox,, % A_ScriptName " :: " rTmp1, % msg, % delay
Exit
}

SplitPath( fullPath, byRef aFile="", byRef aDir="", byRef aExt="", byRef aDrive="", byRef aNameOnly="" )
{
	fullPath.=((inStr(FileExist(fullPath), "D") && SubStr(fullPath, 0) <> "\") ? "\" : "")
	SplitPath, fullPath, aFile, aDir, aExt, aNameOnly, aDrive
	aDir.=(aDir && (aDir==aDrive)) ? "\" : ""
return 
}




- - - Fernsteuern des TCs

SendMessage "WM_InvokeMenuCommand" an "WM_User+51" (=1075)



Ein WM_InvokeMenuCommand an TC wurde von Herrn Ghisler als WM_USER+51 =1075 definiert.
Wenn der TC eine Nachricht "1075" (bzw. x433) erhält, weiß er das die für ihn ist
und "WM_InvokeMenuCommand mit WPARAM und eventuell einem LPARAM" bedeutet.

In WPARAM soll die Nummer des TC-internen Kommandos stehen (siehe TOTALCMD.INC)
In LPARAM dann das Argument für den Befehl in WPARAM.


History.txt
15.05.16 Added: The following commands now accept a numeric parameter:
cm_GoToFirstEntry=2049;Place cursor on first folder or file (und noch mehr, siehe History.txt)

Diese Kommandos kann man auch über ein Skript senden, übergebe die "numeric parameter" als LPARAM.
Die "numeric parameter" starten bei "0" für den ersten Eintrag in der Dateiliste, man muss also immer
vom gewünschten Wert eins abziehen; somit geht LPARAM=4 zum fünften Eintrag in der Dateiliste.
Anwendungsbeispiel mit AutoHotkey:
SendMessage, Msg , wParam, lParam, Control, WinTitle,
SendMessage, Msg , TC Befehl, Nummer-Parameter, , WinTitle,
SendMessage 1075, 2049, 4, , ahk_class TTOTAL_CMD
mehr...
15.05.16 Added: The following commands now accept a numeric parameter in the button bar or start menu:
CM_WAIT
cm_Select=2936;Select file under cursor, go to next
CM_UNSELECT
CM_REVERSE
cm_GoToFirstEntry=2049;Place cursor on first folder or file
cm_GoToFirstFile=2050;Place cursor on first file in list
CM_SWITCHDRIVE
CM_DELETE
CM_LEFTSWITCHTOTHISCUSTOMVIEW
CM_RIGHTSWITCHTOTHISCUSTOMVIEW
CM_SEARCHFORINCURDIR
CM_DIRECTORYHOTLIST
(32/64)


Dies kann auch über ein Skript gesendet werden, trage den "numeric parameter" bein LPARAM ein.

You can also send them via script, just put the numbers in lparam.
- cm_GoToFirstEntry=2049;Place cursor on first folder or file:
- - Place cursor on 5th item, folder OR file:
- - - PostMessage,1075,2049,4

Code: Select all

#SingleInstance, Force

#IfWinExist, ahk_class TTOTAL_CMD

$#a::	;press shortcut Win-A

	;TC internal commands are sent like that with AHK:
	;SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout]
	;TC7 : WM_USER+51 = 1075

	;TC9beta1 
	;15.05.16 Added: The following commands now accept a numeric parameter: 

	;cm_GoToFirstEntry=2049;Place cursor on first folder or file
	;The numeric parameter counts folder and files, off by +1, so number 4 will go to 5th item
	;Place cursor on 5th item, folder OR file:
	PostMessage,1075,2049,4

	;cm_GoToFirstFile=2050;Place cursor on first file in list
	;The numeric parameter counts files only, off by +1, so number 3 will go to 4th item
	;Place cursor on 4th file:
	PostMessage,1075,2050,3


	;cm_Select=2936;Select file under cursor, go to next
	;Select 3 items:
	PostMessage,1075,2936,3

Return

- - -

Andere UINTs Möglichkeiten:



Generell mögliche Message-Arten:

Siehe "List of Windows Messages - Win32" : zB bei https://en.wikichip.org/wiki/List_of_Windows_Messages_-_Win32

---

Gefundene Beispiele:

- - -
LB_GETSELCOUNT = 0x0190
SendMessage LB_GETSELCOUNT, 0, 0, TMyListBox1, ahk_class TTOTAL_CMD

; LB_GETCARETINDEX = 0x19F
SendMessage, 0x19F, , , %FocusedControl%, ahk_class TTOTAL_CMD
VarSetCapacity(CurrentItem, 260)
; LB_GETTEXT = 0x189
SendMessage, 0x189, %ErrorLevel%, &CurrentItem, %FocusedControl%, ahk_class TTOTAL_CMD

https://www.ghisler.ch/board/viewtopic.php?p=111502

- - -

Kollabieren von Dateisequenzen
Hacker wrote: 2006-09-05, 23:41 UTC ; Language: AutoHotkey <http://www.autohotkey.com/>

; NUR EIN TEIL DES CODES, besuche den Post für mehr...

; cm_OpenNewTab = 3001 ; open new tab
; SendMessage 1075, cm_OpenNewTab,,, ahk_class TTOTAL_CMD
cm_FocusCmdLine = 4003
SendMessage 1075, cm_FocusCmdLine,,, ahk_class TTOTAL_CMD
Send cd \\\Sequences\%path%{Backspace}{Enter}
- - -

AHK script for current dir in titlebar

Verwende die AU3_Spy.exe aus dem AutoHotkey-Paket, um die ID des Controls zu ermitteln.
(Veraltete Methode, Herr Ghisler hat etwas besseres eingebaut, siehe nächsten Post von Hacker)
tuska wrote: 2017-10-07, 21:57 UTC Determine the contents of the "ClassNN" field (in this case, the path in TC):
http://www.bilder-hochladen.net/files/big/lwdu-n-bc87.png
- - -

AHK script for current dir in titlebar
Hacker wrote: 2017-10-08, 22:33 UTC Don't use ClassNN with the x64 version. From my experience it gets assigned by Windows semi-randomly and is often (usually?) different between PC's. If you need to get the panel names for some reason, use this:
08.06.16 Added: Send WM_USER+50 with wparam=1..29 -> returns window handle of control. Controls are: 1=leftlist, 2=rightlist, 3=active list, 4=inactive list, 5=leftheader, 6=rightheader, 7=leftsize, 8=rightsize, 9=leftpath, 10=rightpath, 11=leftinfo, 12=rightinfo, 13=leftdrives, 14=rightdrives, 15=leftpanel, 16=rightpanel, 17=bottompanel, 18=lefttree, 19=righttree, 20=cmdline, 21=curdirpanel, 22=inplaceedit, 23=splitpanel, 24=leftdrivepanel, 25=rightdrivepanel, 26=lefttabs, 27=righttabs, 28=buttonbar, 29=buttonbarvertical (32/64)
This works:

Code: Select all

#IfWinExist, ahk_class TTOTAL_CMD

; Default shortcut is Win-A
$#a::
	SendMessage, 1074, 17
	WinGetText, PathInTC, ahk_id %ErrorLevel%
	StringTrimRight, PathInTC, PathInTC, 3
	Send, {Raw}%PathInTC%\
Return
You can still use the previous code which simply looks for the appropriate string:

Code: Select all

#IfWinExist, ahk_class TTOTAL_CMD

; Default shortcut is Win-A
$#a::
	WinGetText, TCWindowText, ahk_class TTOTAL_CMD
	RegExMatch(TCWindowText, "m).*?(?=>)", PathInTC)
	Send, {Raw}%PathInTC%\
Return
- - -

Custom navigation by skipping several files?
Hacker wrote: 2017-11-26, 18:33 UTC An AutoHotkey script as a workaround:

Code: Select all

#NoEnv
; NUR EIN TEIL DES CODES, besuche den Post für mehr...
#IfWinActive, ahk_class TTOTAL_CMD
	SendMessage, 1074, 3
	ActiveFilePanelHwnd = %ErrorLevel%
	ControlGetFocus, FocusedControl, A
	ControlGet, FocusedControlHwnd, Hwnd, , %FocusedControl%, A
	IfEqual, FocusedControlHwnd, %ActiveFilePanelHwnd%
		Send, % Keys[A_ThisHotkey]
	Else
		Send, {%A_ThisHotkey%}
Return
- - -

Sortieren, ohne Fokus auf Datei zu behalten
Hacker wrote: 2018-08-31, 20:16 UTC wir können die aktuelle Position des Kursors ermitteln mittels

Code: Select all

SendMessage, 1074, 1000, , , ahk_class TTOTAL_CMD
SendMessage, 1074, 1006 + ErrorLevel, , , ahk_class TTOTAL_CMD
CursorPos = %ErrorLevel%
- - -

VBScript: SendMessage (switch to defined folder plus Date)
viewtopic.php?p=341233#p341233
viewtopic.php?p=337552#p337552

'VBScript SendMessage 'http://demon.tw/copy-paste/vbs-sendmessage.html 'BY Coo_boi
Function SendMessage(lpWinTitle,wMsg,wParam,lParam)
Dim WordApp,ShApp,colTask,oTask
Set WordApp=CreateObject("Word.Application")

- - -

Strg-V verbessern (je nach Inhalt d. Zwischenablage
MarcRené wrote: 2018-02-23, 16:05 UTC
Hier das passende Autohotkey-Script:

Code: Select all

IfNotExist, %clipboard% { exit }
  
IfWinActive, ahk_class TTOTAL_CMD ; nur, wenn der TC auch aktiv ist
{ 
    if DllCall("IsClipboardFormatAvailable", "uint", 1) ; Clipboard enthält Text => Pfad wechseln
      {
        cm_EditPath := 2912 
        SendMessage 1075, %cm_EditPath%, 0 
        if ErrorLevel <> FAIL 
        Send ^v{Enter} 
      ; NUR EIN TEIL DES CODES, besuche den Post für mehr...
 
- - -

synchronize dirs: go to the current dir in the (2-nd??) TC?
StatusQuo wrote: 2017-08-07, 17:36 UTC Terka, the hint I got was from icfu in this post.

This is how the code works:

Getting the contents (individually for each line) is done by sending DDE messages to the TC Sync window;
MS offers some documentation e.g. here.

Code: Select all

	ControlGetFocus, Panel_id
gets the Listbox control name,

Code: Select all

	LB_GETCARETINDEX := 0x019F
	SendMessage, %LB_GETCARETINDEX%, 0, 0, %Panel_id%
	LB_CursorPosition := ErrorLevel
stores the selected line number in LB_CursorPosition
(LB_GETCARETINDEX = 0x019F is the command,
result is returned via Errorlevel),

Code: Select all

	LB_GETTEXT := 0x0189
	VarSetCapacity(LB_String, 1024, 0)
	SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%
	LB_CursorLine := LB_String
puts the line's content into LB_CursorLine
(LB_GETTEXT = 0x0189 is the command,
&LB_String is a pointer to some memory address where the result shall be stored,
VarSetCapacity reserves some storage space there before using it).

The Loop then starts at the known cursor position and goes up until it finds the subfolder the selected file is in,
which is combined with the base folders, that can be retrieved from the controls on the top using AU3_Spy.
- - -

(gefunden und hier reingepastet, muss noch an den richtigen platz)

What type number instead of 21 for FullPathSRC
Skif_off wrote: 2016-08-28, 07:43 UTC Use %P%N (or %V) or add to script:
1. Send WM_USER+50 with wparam set to 1000 to get active panel: 1=left, 2=right;
2. Send WM_USER+50 with wparam set to 1007/1008 to get index of current item (caret);
3. Send LB_GETTEXTLEN;
4. Send LB_GETTEXT.

Add:

Sorry, I forgot:
25.11.11 Added: Send WM_COPYDATA with dwData='G'+256*'A' and lpData pointing to command to get back WM_COPYDATA with various info.
Supported commands A:
Active side (returns L or R),
or two byte command: first byte: L=left, R=right, S=source, T=target.
Second byte:
P=current path, C=list count, I=caret index, N=name of file under caret.
dwData of return is 'R'+256*'A' (32/64)
New WM_COPYData Examples.

- - -

- - -

So werden in Windows Nachrichten versandt
https://msdn.microsoft.com/de-de/library/bb979347.aspx
Veröffentlicht: 15. Dez 2001 | Aktualisiert: 18. Jun 2004 : Von Paul DiLascia
Das Versenden von Nachrichten kann mit verschiedenen Funktionen geschehen, die alle ihre Vor- und Nachteile haben.
Frage: Was ist eigentlich der Unterschied zwischen PostMessage und SendMessage?
Antwort: >> https://msdn.microsoft.com/de-de/library/bb979347.aspx


- - -

right click context menu

I read on the FAQ that you need to press and hold the right mouse button in order to have the context menu show.
That doesn't work for me [...because I use StrokeIt...]
StrokeIt is a mouse gesture app for Windows.. once I disabled it,
I got the context menu back on TC on right click after an second!
ghisler(Author) wrote: 2009-08-02, 13:56 UTC by *ghisler(Author) » Sun Aug 02, 2009 15:56

Maybe you could configure a gesture in StrokeIt which would send the command cm_contextmenu to TC?
To do this, post message WM_USER+51 to the TC window with
WParam=2500
and
LParam=0

- - -

- - -

- - -

- - -
- - -

Gesammelte Infos über WM_COPYDATA, WM_USER+50 und WM_USER+51 im TC
by *diopter » Sun Sep 09, 2018 14:11
viewtopic.php?p=346966#p346966

- - -

- - -
Alte Infosammlung

TC9: "Send WM_USER+50 with wparam" - how-to?
viewtopic.php?p=310263#p310263

- - -

- - -


- - - puh :roll: :?


.
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post 6 - Externe Tools zur direkten Dateimanipulation

Post by *Stefan2 »

Post 6 - Externe Tools zur direkten Dateimanipulation

<to do>

addtime\
redate\
TimeAdjust\
TimeCopy\
AskParam\
CopyToTabs\
DupSel\
extDir\
F4Menu\
F4MiniMenu\
NewFilePutFile\
NirSoft\ ?
NotePad2\







 
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Platzhalter

Post by *Stefan2 »

Platzhalter





 
User avatar
Stefan2
Power Member
Power Member
Posts: 4132
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Platzhalter

Post by *Stefan2 »

Platzhalter






 
Post Reply