rabe62
Goto Top

Copy mit Dateinamen aus Inhalten von Textdateien

Eine Datei mit einem Standardisierten Dateinamen versehen, dessen Namensteile teilweise aus Textdateien stammen

Hi all,

vor 20 Jahren war die Kommandozeile mein Zuhause. Mit Windows ist das aber verdammt eingerostet. Nach langem googeln brauche ich nun doch einen Schubser um meine Aufgabenstellung zu lösen.

Ausgangssituation:
Ein Win7-System mit einem Ordner mit den Dateien
.brand.txt - enthält einen Text mit einem Kürzel des aktuell verwendeten Brand (z.B. bsit)
.version.txt - enthält einen Text mit der Versionsnummer (z.B. 1.02)
handout.pdf - eine zu kopierende und dabei neu zu benennende Datei

Ziel:
Mit der rechten Maustaste auf die Datei handout.pdf "Senden an" die Datei (gern auch mehrere markierte gleichzeitig) einem Batch übergeben, der im gleichen Verzeichnis eine Kopie der handout.pdf erstellt, die einen neuen Dateinamen erhält.

Der Dateiname setzt sich wie folgt zusammen:

4t_[inhaltVon.brand.txt]_[originalDateiName]_v[inhaltVon.version.txt]_[yyyy-mm-dd].[originalExtension]

Also im Beispiel:
4t_bsit_handout_v1.02_2013-02-18.pdf

Ich wollte in einem Batch Umgebungsvariablen mit den Inhalten der Dateien .brand.txt und .verison.txt setzen und diese dann im Copy verwenden. Aber schon diese schlichte Aufgabe überfordert mich gerade. Und selbst Google hat mir bisher nicht geholfen. Wahrscheinlich formuliere ich die Fragen falsch.

Kann mir hier jemand einen kleinen Anschubser geben?

Viele Grüße
Ralf...

Content-ID: 201969

Url: https://administrator.de/contentid/201969

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

bastla
bastla 18.02.2013 um 19:33:59 Uhr
Goto Top
Hallo RaBe62!

Um den Inhalt der ersten Zeile von ".brand.txt" in die Variable %Brand% zu bekommen, sollte
set /p Brand=<.brand.txt
genügen ...
Den Originaldateinamen einer dem Batch als Parameter übergebenen Datei erhältst Du mit "%~n1", den Typ mit "%~x1".

Genug geschubst? face-wink

Grüße
bastla
mupan7
mupan7 18.02.2013 um 20:55:35 Uhr
Goto Top
Sehr viel lässt sich auch mit dem Swiss File Knife (http://stahlworks.com/dev/swiss-file-knife.html) machen.
RaBe62
RaBe62 19.02.2013 um 11:10:08 Uhr
Goto Top
Hallo bastla,

jaaaa - ein Schubser, wie er besser nicht hätte sein können - Danke.

Viele Grüße
Ralf...
RaBe62
RaBe62 19.02.2013 um 11:11:28 Uhr
Goto Top
Hallo mupan7,

meine Aufgabe habe ich auch ohne das Messer gelöst bekommen. Aber ich habe immer wieder das Problem, Leerzeichen aus Dateinamen entfernen zu müssen. Da passt das Messer ausgezeichnet - vielen Dank.

Viele Grüße
Ralf...
bastla
bastla 19.02.2013 um 11:21:30 Uhr
Goto Top
... obwohl auch
set "DateinameNeu=%DateinameAlt: =_%"
oder
set "DateinameNeu=%DateinameAlt: =%"
kein Hexenwerk ist ... face-wink

Grüße
bastla
RaBe62
RaBe62 19.02.2013 um 11:42:32 Uhr
Goto Top
Meine Lösung ist jetzt ein Batch mit Link im SendTo

@echo off & setlocal
:Loop
if "%~1"=="" goto :eof
set /p brand=<_brand.txt
set /p project=<_project.txt
set /p version=<_version.txt
copy %1 "%~d1%~p14t_%brand%_%project%_%~n1_v%version%%~x1"
shift
goto :Loop

Macht genau was ich will.

Aaaaber - jetzt sind x neue Datein im Ordner und werden nicht (sofort) im Explorer angezeigt. Erst ein F5 bringt sie hervor.

Für den geübten User kein Problem. Aber wir kennen doch alle DAU, der dann sagt "hier geht gar nix mehr".

Frage:
Kann ich aus einem Batch irgendwie ein Reload (F5) des Explorers veranlassen? (Das ist eindeutig nach meiner aktiven Batch-Zeit auf 4dos face-wink )

Gruß
Ralf...
bastla
bastla 19.02.2013 um 12:21:34 Uhr
Goto Top
Hallo RaBe62!
Kann ich aus einem Batch irgendwie ein Reload (F5) des Explorers veranlassen?
Kaum; allenfalls könntest Du ein neues Fenster öffnen mit
if "%~1"=="" if defined Pfad start explorer "%Pfad%" & goto :eof  
if not defined Pfad set "Pfad=%~dp1"  
am Beginn Deiner Schleife.

Grüße
bastla
mupan7
mupan7 19.02.2013 um 14:11:24 Uhr
Goto Top
In Batches ist mir das noch nicht untergekommen. Mit der Powershell kannst du alles machen: http://powershell.com/cs/media/p/8322.aspx Allerdings müssen dazu Skripte erstmal erlaubt werden und / oder du musst dein Skript signieren, also das ist schon ein ganz anderer Ansatz. Vielleicht hilft dir das hier was:

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5f494432 ...

Möglicherweise lässt sich die ChangeNotify-Funktion in shell32.dll ja auch mit einer rundll32-Zeile aufrufen?