Programm nacheinander mit jeder gewählten Datei ausführen

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
MichaelK
Junior Member
Junior Member
Posts: 23
Joined: 2004-07-08, 07:25 UTC
Location: Stromberg, Rlp

Programm nacheinander mit jeder gewählten Datei ausführen

Post by *MichaelK »

Hallo,

ich möchte mit Total Commander für jede ausgewählte Datei nacheinander ein Programm aufrufen. Es gelingt mir leider nicht.

Konkret geht es um das Utility pngcrush, das eine PNG Datei optimiert. Ich möchte also beispielsweise folgende Sequenz an Kommandos ausführen:

pngcrush -ow -oldtimestamp -rem alla datei1.png
pngcrush -ow -oldtimestamp -rem alla datei2.png
...
pngcrush -ow -oldtimestamp -rem alla datei8.png
pngcrush -ow -oldtimestamp -rem alla datei9.png

Die offensichtliche Methode, einen Button zu definieren und das Kommando zu hinterlegen, funktioniert leider nicht. Es wird nur die letzte Datei in der Liste bearbeitet.

Dann habe ich das ganze mit lst2mlt probiert, aber leider auch ohne Erfolg. lst2mlt wartet nicht auf das Ende des vorherigen Kommandos, sondern führt das Kommando gleichzeitig so oft aus, wie es Dateien gibt. Das führt zu einem völligen Chaos, weil pngcrush offensichtlich eine temporäre Datei anlegt, die sofort von der nächsten Instanz von pngcrush wieder überschrieben wird, mit dem Ergebnis, daß am Ende von 80 PNG Files 30 verschwunden sind.

Sorry, ich steh auf dem Schlauch. So schwierig kann das doch nicht sein.

Vielen Dank für Eure Hilfe.
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6509
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

Das laesst sich mit Christians MakeBAT Plugin loesen.
http://www.ghisler.com/plugins.htm
MichaelK
Junior Member
Junior Member
Posts: 23
Joined: 2004-07-08, 07:25 UTC
Location: Stromberg, Rlp

Post by *MichaelK »

Hallo Horst,

vielen Dank für die schnelle Antwort. Es funktioniert. Richtig glücklich macht mich die Lösung allerdings nicht. Ich würde mir einen Button wünschen, der auf Knopdruck genau die selektierten Dateien bearbeitet. Ein Batchfile zu erzeugen, das dann noch in den gewünschten Pfad verschoben und ausgeführt werden muß, ist doch irgendwie von hinten durch die Brust ins Auge. Aber gut, es geht. Danke nochmal.

Michael
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1014
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

Makebat ist für Schnellschüsse hervorragend, für komplexere Sachen verwende ich diese .cmd Vorlage:

Code: Select all

@echo off
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 (
	
	rem ============== Insert your custom commands here ==============
	
	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
	
	rem ==============================================================
)
echo %concat%
echo !concat!
pause
cls
endlocal
Auf nen Button legen mit Parameter "%F" "%P" "%T"

Für deinen Fall wäre das wohl:

Code: Select all

@echo off
setlocal enabledelayedexpansion
rem Button Parameter "%F" "%P" "%T"
set tc_lst=%1
set tc_src=%2
set tc_dst=%3

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 (
	pngcrush -ow -oldtimestamp -rem alla "%%I"
)
pause
cls
endlocal
MichaelK
Junior Member
Junior Member
Posts: 23
Joined: 2004-07-08, 07:25 UTC
Location: Stromberg, Rlp

Post by *MichaelK »

Super, das ist es! Vielen Dank.

Da pngcrush den Zeitstempel nicht beibehält, wenn man die Originaldatei überschreibt, habe ich nun zwei Schritte gemacht:

"c:\Program Files (x86)\Utilities\pngcrush.exe" -oldtimestamp -rem alla -q %%~fI tmp.png
move /y tmp.png %%~fI >nul

Das ist genau, was ich wollte. Danke

Michael
User avatar
tbeu
Power Member
Power Member
Posts: 1336
Joined: 2003-07-04, 07:52 UTC
Location: Germany
Contact:

Post by *tbeu »

Siehe auch lst2run und RunOnAllCores.
TC plugins: Autodesk 3ds Max / Inventor / Revit Preview, FileInDir, ImageMetaData (JPG Comment/EXIF/IPTC/XMP), MATLAB MAT-file Viewer, Mover, SetFolderDate, Solid Edge Preview, Zip2Zero and more
User avatar
Hacker
Moderator
Moderator
Posts: 13074
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

MichaelK,

Code: Select all

RunOnAllcores.ahk "%L" "pngcrush -ow -oldtimestamp -rem alla ""#####"""
HTH
Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
MichaelK
Junior Member
Junior Member
Posts: 23
Joined: 2004-07-08, 07:25 UTC
Location: Stromberg, Rlp

Post by *MichaelK »

Danke für den "RunOnAllcores" Hinweis. Ich habe es nicht ausprobiert, denke aber das das wegen der temporären Files genau wie lst2run in die Hose geht. Ich muß wirklich jede Datei nacheinander behandeln, da darf nichts parallel laufen.
Ein weiteres Problemchen will ich noch beschreiben. Nachdem das auf dem englischen Windows in der Firma so schön läuft, wollte ich das zu Hause auf einem deutschen Windows auch installieren. Dummerweise heißt der Folder aber nicht "Utilities" sondern "Zubehör". Es hat viele Versuche gebraucht, bis ich herausgefunden habe, daß das CMD-File das "ö" nicht versteht. UltraEdit kann zwar verschieden Konversionen (ASCII, ANSI, OEM, Unicode, UTF-8 und sogar EBCDIC), aber keine hat gefruchtet. Ich habe irgendwann aufgegeben und einen Ordner namens "Utility" angelegt. Ich bin sicher, daß es irgendwie auch mit dem "ö" funktionieren muß, aber ich wollte mir nicht das ganze Wochenende mit diesem Mist versauen.
User avatar
Dalai
Power Member
Power Member
Posts: 9409
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

MichaelK wrote:Nachdem das auf dem englischen Windows in der Firma so schön läuft, wollte ich das zu Hause auf einem deutschen Windows auch installieren. Dummerweise heißt der Folder aber nicht "Utilities" sondern "Zubehör". Es hat viele Versuche gebraucht, bis ich herausgefunden habe, daß das CMD-File das "ö" nicht versteht. UltraEdit kann zwar verschieden Konversionen (ASCII, ANSI, OEM, Unicode, UTF-8 und sogar EBCDIC), aber keine hat gefruchtet. Ich habe irgendwann aufgegeben und einen Ordner namens "Utility" angelegt. Ich bin sicher, daß es irgendwie auch mit dem "ö" funktionieren muß, aber ich wollte mir nicht das ganze Wochenende mit diesem Mist versauen.
Nimm ASCII, das funktioniert. Das Thema kam hier im Forum auch schon öfter hoch, wenn z.B. mit TC erstellte Dateilisten mit einer Batch verarbeitet werden sollten und potentiell Umlaute oder andere Sonderzeichen in den Dateinamen vorkommen.

Es gibt noch eine andere Möglichkeit, nämlich die Kodierung des Systems (aus der Registry) zu ermitteln, darauf umzuschalten und die Liste erst dann zu verarbeiten. Das sollte sich finden lassen mit einer Suche nach "reg.exe" mit mir als Autor; z.B. in diesem Thema (direkt zum relevanten Post).

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1014
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

UTF Support ist zumindest im Backlog der CMD-Entwickler für Windows 10. Link1 Link2.
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

Anscheinend rede ich hier gegen Wände.
Man kann schon lange Unicode mit der cmd.exe nutzen, zumindest wenn es um Parameter geht.

Ein Beispiel welches genau wie hier eine Stapelverarbeitung der selektierten Dateien anstößt
hatte ich z.B. hier schon einmal erwähnt.
Voraussetzung ist dass das Programm, welches mehrfach aufgerufen wird, mit Unicode-Unterstützung kompiliert ist,
also z.B. bei MSVC der Compiler mit /D "_UNICODE" /D "UNICODE" aufgerufen wird.

Wenn man jetzt die Codepage 65001 (= UTF8) setzt, wird brav in das Windows-native UTF-16 konvertiert,
und das Programm kann sich die Kommandozeilen-Paramter mittels argv[...] als Unicode holen,
indem man mittels TC eine UTF-8-Listendatei übergibt, und diese entsprechend splittet.

Voraussetzung ist dann aber weiterhin, dass man die UTF-8-BOM entfernt, sonst wird die erste Datei ruiniert,
da TC nicht in der Lage ist eine BOM-lose Datei zu erzeugen.
(hier hatte ich schon einmal vorgeschlagen BOM-lose Dateien zu erzeugen)

Mag sein dass es das ein oder andere Problem gibt, aber so lange man sich auf simple Stapelverarbeitung beschränkt und die shell nicht
manuell bedient so lange chcp 65001 gesetzt ist funktioniert es bei mir ohne Probleme.
TC plugins: PCREsearch and RegXtract
User avatar
Hacker
Moderator
Moderator
Posts: 13074
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

MichaelK,
Danke für den "RunOnAllcores" Hinweis. Ich habe es nicht ausprobiert, denke aber das das wegen der temporären Files genau wie lst2run in die Hose geht. Ich muß wirklich jede Datei nacheinander behandeln, da darf nichts parallel laufen.
Man kann auch spezifizieren, dass das Skript nur einen Thread benutzt.

Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
Post Reply