eccos01
Goto Top

Datei umbenennen in Batchdatei aus Dateiinhalt

hallo,

ich habe eine Zip-Datei für ein Update in der sich der Originalname der Zip-Datei befindet. Mit Hilfe dieses Originalnamens soll die Zip-Datei nach einer ersten Verarbeitung verschoben und umbenannt werden.

Erklärung:
Aus bestimmten programmtechnischen Gründen darf die Zip-Datei nur update.zip heißen.
Sobald die Zip-Datei verarbeitet wurde, würde ich sie gerne an anderer Stelle ablegen... allerdings mit ihrer Versionsbezeichnung (z.B. Update-1.2.3.4.zip)

Der Zielname liegt in einer Datei z.B. version.txt innerhalb des Archives.

Beispiel:

- update.bat liegt in d:\test\install
- update.bat wird d:\test\install\extract entpackt ud verarbeitet (der Teil ist bereits vorhanden!!!)
- Anschließend soll die Datei ins Verzeichnis d:\test\backup_updates verschoben werden
- Der Dateiname soll aber nicht mehr update.zip sondern update-1.2.3.4.zip sein.
- Zielverzeichnis ist statisch und braucht nicht ausgelesen zu werden!
- Die Datei version.txt innerhalb des Archives (update.zip) enthalt folgenden text "update-1.2.3.4.zip".

Wir müßten die passenden Batchzeilen aussehen?
Kommentar vom Moderator Biber am 04.02.2011 um 16:37:20 Uhr
Datei umbennen in Batchdatei aus Dateiinhalt
Ich benne rum, du bennst herum.. *sing* ... bennen wir nicht alle ein wenig?
Set /a rgc+=1
#724

Content-ID: 160131

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

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

bastla
bastla 04.02.2011 um 13:16:55 Uhr
Goto Top
Hallo eccos01!

Falls zumindest XP als OS vorausgesetzt werden darf, ginge mit ein wenig temporärem VBS (zB dem VBA hier "nachempfunden") das Ganze mit Bordmitteln etwa so (kaum getestet):
@echo off & setlocal
set "ZIP=d:\test\install\update.zip"  
set "Datei=version.txt"  
set "Ziel=%TEMP%"  
set "Bak=d:\test\backup_updates"  

set U=%temp%\Unzip.vbs
> %U% echo Set App=CreateObject("Shell.Application"):Set a=WScript.Arguments:ZIP=a(0):Target=a(1):File=a(2)  
>>%U% echo For Each FN In App.Namespace(ZIP).Items:If LCase(FN)=LCase(File) Then App.Namespace(Target).CopyHere App.Namespace(ZIP).Items.Item(File):End If:Next
cscript //nologo %U% "%ZIP%" "%Ziel%" "%Datei%"  
if not exist "%Ziel%\%Datei%" echo Datei "%Datei%" nicht gefunden! & goto :eof  
set /p VersName=<"%Ziel%\%Datei%"  
del %U%
del "%Ziel%\%Datei%"  

md "%Bak%" 2>nul  
move "%ZIP%" "%Bak%\%VersName%"  
Als weitere Voraussetzung muss der Inhalt der ersten Zeile von "version.txt" einen gültigen Dateinamen ergeben.

Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 13:43:05 Uhr
Goto Top
Aloha bastla,

Zeile 11 verwirrt mich: Was nutzt das echo, wenn danach das Fenster zugeht und man das echo nicht mehr lesen kann?

greetz André

edit:
egal, was hier vorher stand ... funktioniert *pfeif* schneller getippt als Windows reagieren kann
eccos01
eccos01 04.02.2011 um 14:02:46 Uhr
Goto Top
Geht es auch mit reinem Batch-Scripting.... also ohne VBS?

Weil es muß auf Win 2000, Win XP, Win 7, Win2k3 Server, Win2k8 Server und Win 2k8 R2 Server laufen...

und mit den ganzen Sicherheitseinschränkungen dort, wäre mir eine Variante nur mit Batch lieber.
Skyemugen
Skyemugen 04.02.2011 um 14:19:40 Uhr
Goto Top
Aloha,

laufen würde es überall - sind bei euch Skripte à la .vbs deaktiviert?

Ich bezweifle, dass es mit batch only machbar ist (bzw. man ruft per batch wiederum ein weiteres Programm auf, dann sicherlich)

greetz André
eccos01
eccos01 04.02.2011 um 14:39:37 Uhr
Goto Top
Denke schon, dass das machbar ist... habe so was ähnliches hier gefunden...

01. @echo off & setlocal
02. set "Basis=D:\Songs"
03.
04. for /r "%Basis%" %%i in (*.txt) do (
05. ren "%%~dpi*.jpg" "%%~ni.*" 2>nul
06. ren "%%~dpi*.mp3" "%%~ni.*" 2>nul
07. )
08. pause


Aber ich kenn mich mit den for-Kommando nicht wirklich aus...
ich muß also einfach nur denDateinamen aus der datei auslesen und in eine Umgebungsvariable einfügen... das muss doch ohne VB-Skript gehen, oder?
bastla
bastla 04.02.2011 um 14:51:28 Uhr
Goto Top
Hallo eccos01!

Das Umbenennen / Verschieben lässt sich natürlich per native Batch erledigen (passiert ja auch ab Zeile 12 meines Ansatzes) - das VBScript wird nur für das Entpacken benötigt; Letzteres wiederum kann aber alternativ nur durch ein zusätzliches Programm erfolgen ...

Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 14:51:44 Uhr
Goto Top
Aloha eccos ...

dann erkläre mir auch bitte, wie du die Datei extrahierst ohne Extraprogramm oder .vbs?!

greetz André

edit: arr bastla du kurz-vor-mir-poster ;)
eccos01
eccos01 04.02.2011 um 14:53:44 Uhr
Goto Top
Übrigens... um das entpacken muß sich das Skript nicht kümmern... das läuft bereits.
Update.zip wird entpackt, die Verarbeitung läuft und version.txt wäre direkt im Zugriff!

Daß heißt, daß es nur darum geht, den neuen Namen aus version.txt zu ermitteln und update.zip umzubenennen.
bastla
bastla 04.02.2011 um 14:54:34 Uhr
Goto Top
@Skyemugen
Was nutzt das echo, wenn danach das Fenster zugeht und man das echo nicht mehr lesen kann?
Ich habe ja kein "exit" dahinter geschrieben face-wink - also bleibt das CMD-Fenster, aus dem ich den Batch starte, auch offen.

Tatsächlich steht das nur dort, damit eccos01 einen Hinweis darauf hat, wo im Code auf den Misserfolgsfall (für den es ja bis jetzt noch keine Handlungsanweisung gibt) zu reagieren wäre (und ja, ich hatte fast schon ein "pause" - für die Doppelklick-Fraktion - auch noch hingeschrieben) ...

Grüße
bastla
bastla
bastla 04.02.2011 um 14:55:51 Uhr
Goto Top
Hallo eccos01!
... den neuen Namen aus version.txt zu ermitteln und update.zip umzubenennen
Den Ansatz dafür solltest Du, wie angemerkt, dem Teil ab Zeile 12 entnehmen können ...

Grüße
bastla
eccos01
eccos01 04.02.2011 um 14:58:26 Uhr
Goto Top
Zitat von @bastla:
Hallo eccos01!
> ... den neuen Namen aus version.txt zu ermitteln und update.zip umzubenennen
Den Ansatz dafür solltest Du, wie angemerkt, dem Teil ab Zeile 12 entnehmen können ...

Grüße
bastla

Vielleicht bin ich ja zu doof... aber wo liesst Du (ab Z.12) den neuen Dateinamen aus der Datei "version.txt"?

der rename / Move ist ja klar.
bastla
bastla 04.02.2011 um 15:00:30 Uhr
Goto Top
Hallo eccos01!
aber wo liesst Du (ab Z.12) den neuen Dateinamen aus der Datei "version.txt"?
Na in Zeile 12 face-wink (bei mir landet beim Entpacken die "version.txt" = %Datei% im TEMP-Ordner = %Ziel%)

Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 15:00:55 Uhr
Goto Top
Aloha bastla,

bei mir ging das ganze Fenster zu, wenn ich die .bat ausgeführt habe und die Datei nicht da war ... darum verwunderte es mich (Angehöriger der Doppelklickfraktion ^.^)

@eccos

... wieder mal nur die halbe Info gegeben? Da hätte man sich das Extrahieren auch sparen können (extra das Suchen, Testen und Schreiben ... achja)

greetz André
bastla
bastla 04.02.2011 um 15:03:12 Uhr
Goto Top
@Skyemugen
bei mir ging das ganze Fenster zu, wenn ich die .bat ausgeführt habe
... aber nur, wenn es auch vorher nicht offen war ...

Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 15:05:30 Uhr
Goto Top
@bastla

logisch nicht, ich muss ja den Enduser darstellen, der hat keine Shell offen und macht nur Doppelklick ;) (und da müsste dann pause hin)

greetz André
bastla
bastla 04.02.2011 um 15:07:21 Uhr
Goto Top
@Skyemugen
den Enduser darstellen, der hat keine Shell offen und macht nur Doppelklick
... oder dragged und dropped ... face-wink
(und da müsste dann pause hin)
ACK face-smile

Grüße
bastla
eccos01
eccos01 04.02.2011 um 15:47:40 Uhr
Goto Top
Moment...

Du benutzt aber nicht den Inhalt von version.txt sondern würdest den dateinamen von version.txt als neuen dateinamen verwenden, oder???

Wie müßte das Kommando denn lauten, wenn ich aus einer Datei mit Namen: "version.txt" einen String auslesen will, der den neuen Namen enthält... und zwar in der Form "update-1.2.3.4.zip"???
eccos01
eccos01 04.02.2011 um 15:49:16 Uhr
Goto Top
@eccos

... wieder mal nur die halbe Info gegeben? Da hätte man sich das Extrahieren auch sparen können (extra das Suchen,
Testen und Schreiben ... achja)

greetz André

"mea culpa"
Sorry face-sad
Skyemugen
Skyemugen 04.02.2011 um 15:54:33 Uhr
Goto Top
Aloha,

Zitat von @bastla:
Als weitere Voraussetzung muss der Inhalt der ersten Zeile von "version.txt" einen gültigen Dateinamen ergeben.

Dabei fällt mir auf (oder ein) ... das .zip ist weg und nur die extrahierte Datei (mit dem Namen aus Zeile eins der version.txt) ist im Ordner %Bak% ...

(set /p ... sollte das irgendwo zum Tragen kommen?)
bastla
bastla 04.02.2011 um 16:17:45 Uhr
Goto Top
Hallo eccos01!
Du benutzt aber nicht den Inhalt von version.txt sondern würdest den dateinamen von version.txt als neuen dateinamen verwenden, oder???
Nein (hätte ja auch keinen Sinn face-wink)
Wie müßte das Kommando denn lauten, wenn ich aus einer Datei mit Namen: "version.txt" einen String auslesen will, der den neuen Namen enthält... und zwar in der Form "update-1.2.3.4.zip"???
Wenn, wie von Dir oben beschrieben, in der Datei "version.txt" dieser neue Dateiname steht, dann:
set /p NameNeu=<version.txt
BTW: Wozu braucht eine Frage 3 Fragezeichen (oder 2 Fragen 6 Stück face-wink)?
@Skyemugen
(set /p ... sollte das irgendwo zum Tragen kommen?)
Ja - so wie gleich oberhalb gezeigt. face-wink
das .zip ist weg und nur die extrahierte Datei (mit dem Namen aus Zeile eins der version.txt) ist im Ordner %Bak% ...
Dort sollte aber nicht die extrahierte "version.txt", sondern eben die .zip-Datei gelandet sein (mittlerweile getestet ist sie das bei mir auch).

Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 17:21:07 Uhr
Goto Top
Zitat von @bastla:
Dort sollte aber nicht die extrahierte "version.txt", sondern eben die .zip-Datei gelandet sein (mittlerweile getestet
ist sie das bei mir auch).

Aloha bastla,

tja nun, was soll ich sagen 4. Test, diesmal @home (Win 7 statt XP wie auf Arbeit, macht aber keinen Unterschied)

Szenario:

  • update.zip wie gehabt mit enthaltener version.txt (in Zeile eins stehtt 27.1.3b
  • .cmd-Datei liegt im e:\ (zip dort wo sie nach Pfad hingehört, nur e:\... statt d:\...)
  • Datei wird ausgeführt (Ordnerstruktur bereits vorhanden) ...

Resultat:

  • update.zip ist weg
  • im Ordner %Bak% (also bei mir: E:\test\backup_updates\) liegt jetzt eine 27.1.3b (3B-Datei) ...

Bin ich heute so neben der Spur oder mögen mich die Fenster heute nicht?

greetz André
bastla
bastla 04.02.2011 um 17:30:42 Uhr
Goto Top
Hallo Skyemugen!
Eigentlich sollte (lt Beschreibung des TO: "update-1.2.3.4.zip") in der "version.txt" zumindest
27.1.3b.zip
stehen - deswegen auch mein Hinweis auf einen gültigen Dateinamen.

Wenn Du dem Namen Deiner Datei im Ordner %Bak% noch ein ".zip" anfügst, solltest Du sie auch wie gewohnt öffnen können und darin die "version.txt" finden - schließlich ist es ja die zwar verschobene und umbenannte, aber originale "update.zip" ...

Wenn dem auch bei Dir so ist, hätten wir den Status (Zitat Biber) "works as designed" erreicht. ;-.)

Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 17:41:21 Uhr
Goto Top
Aloha,

aha achso na gut ... hab ich anders interpretiert, was der TE da zusammengestammelt hat dann geht's ja ... wozu auch immer das Ding jetzt .zip heissen muss, wenn nix drin ist

greetz André
bastla
bastla 04.02.2011 um 17:45:05 Uhr
Goto Top
Hallo Skyemugen!
wozu auch immer das Ding jetzt .zip heissen muss, wenn nix drin ist
Dass nix drin wäre ist aber nicht der Soll-Zustand - eigentlich müsste der gesamte Inhalt (und wenn's nur eine "version.txt" ist) noch vorhanden sein, da es sich ja um die Ausgangs-ZIP-Datei handelt (jetzt eben mit neuem Namen an neuem Ort).

Grüße
bastla
eccos01
eccos01 04.02.2011 um 17:45:36 Uhr
Goto Top
Zitat von @bastla:
Hallo eccos01!
> Du benutzt aber nicht den Inhalt von version.txt sondern würdest den dateinamen von version.txt als neuen dateinamen
verwenden, oder???
Nein (hätte ja auch keinen Sinn face-wink)
> Wie müßte das Kommando denn lauten, wenn ich aus einer Datei mit Namen: "version.txt" einen String
auslesen will, der den neuen Namen enthält... und zwar in der Form "update-1.2.3.4.zip"???
Wenn, wie von Dir oben beschrieben, in der Datei "version.txt" dieser neue Dateiname steht, dann:
set /p NameNeu=<version.txt
> 
BTW: Wozu braucht eine Frage 3 Fragezeichen (oder 2 Fragen 6 Stück face-wink)?
@Skyemugen
> (set /p ... sollte das irgendwo zum Tragen kommen?)
Ja - so wie gleich oberhalb gezeigt. face-wink
> das .zip ist weg und nur die extrahierte Datei (mit dem Namen aus Zeile eins der version.txt) ist im Ordner %Bak% ...
Dort sollte aber nicht die extrahierte "version.txt", sondern eben die .zip-Datei gelandet sein (mittlerweile getestet
ist sie das bei mir auch).

Grüße
bastla


So... auch ich hab es verstanden und es klappt!

Wie kann ich denn testen, ob das was in der Datei bzw. nach dem set in der Umgebungsvariable steht, mit "update-" beginnt?
Kann man irgendwie sowas wie "begins" testen?
bastla
bastla 04.02.2011 um 17:50:58 Uhr
Goto Top
Hallo eccos01!

Etwa so:
echo %NameNeu%|findstr /i /b "update-" >nul && echo is ok || echo das war wohl nix
Grüße
bastla
Skyemugen
Skyemugen 04.02.2011 um 17:52:33 Uhr
Goto Top
Aloha,

hm ne war mal wieder ein Freitagsfehler von mir ^.^ hab einfach umbenannt in .zip aber ist nicht höhö - hab's nochmal nach TE-Standard getestet, haut schon hin je näher das WE rückt, desto mehr ist mein brain im Energiesparmodus

greetz André

ach herrje so viele postings für nichts ... der reinste spam schon fast - sollte mal wer aufräumen => fusen

edit:
Die Datei version.txt innerhalb des Archives (update.zip) enthalt folgenden text "update-1.2.3.4.zip".

Stand das schon den ganzen Tag da? ... au weia, da hab ich schon Kontaktlinsen drin ...
eccos01
eccos01 04.02.2011 um 17:54:32 Uhr
Goto Top
Zitat von @bastla:
Hallo eccos01!

Etwa so:
echo %NameNeu%|findstr /i /b "update-" >nul && echo is ok || echo das war
> wohl nix
> 
Grüße
bastla

Stimmt... heute hab ich echt ein Brett vor dem Kopf.

findstr benutze ich in meinen Skripten so oft...

Danke!!!