djpeti
Goto Top

SaveAs Filenamen via 2 Listen steuern (Batch)?

Hi
Ich bin so ziemlich neu hier und habe dank diesem "Forum" schon einiges über Batch und vermutlich auch vb gelernt beim Durchstöbern. Danke erstemals Allen, die hier so fleissig Fragen beantworten.
Bisher konnte ich meine "Probleme" lösen mit Excel VB und Batch.
Nun komme ich hier nicht mehr weiter:

Folgendes Problem:

Ich habe mehrere Files, deren Inhalt ich übernehmen will, der Filename soll jedoch geändert werden (und das via Save As):

Beispiel:

"Text_164503.txt" soll zu "Text_001.txt" werden.
"Text_168987.txt" soll zu "Text_002.txt" werden

Da hab ich mir gedacht, ich könnte das mit Hilfe eines Batch Scriptes und 2 Textlisten lösen:

In Liste 1 stehen die Namen der bestehenden Files
1.txt:

1056874
6549879
6548542
...

IN Liste 2 stehen die neuen Namen:
2.txt:

001
002
003
...


Was ich jetzt möchte ist, dass ich aus der ersten Liste auslese, welche Files kopiert werden. Die 2te Liste sollten die neuen Filenamen sein, die genau jeweils dem richtigen File in der ersten Liste zugestellt werden:

1056874 soll also zu 001 werden

6549879 zu 002 etc.


Hier meine Überlegung (die Falsch ist und leider nicht wunschgemäss funktioniert):

_______________________________________________________________
@echo off
:1

echo Files will be placed in C:\Temp\...

set /p folder=Please enter folder for new Files C:\temp\:

md c:\temp\%folder%


for /f %%i in (1.txt) do call :arbeiten %%i

:arbeiten

for /f %%a in (2.txt) do copy c:\Temp\Texte\Text_%%i.txt c:\Temp\%folder%\Text_%%i.def_%%a.txt
pause
_______________________________________________________________

Irgendwie klappt das Ganze, allerdings werden alle Files mehrmals wieder überschrieben und man hat keine chance um das zu unterbrechen. Somit habe ich ALLE neuen Namen bzw. txt Files, jedoch steht überall der Inhalt vom ersten File drin.

Hat jemand eine Idee wie das klappen könnte?
Das Ganze kann auch via Backup, Rename und Rückkopie gemacht werden. Allerdings bring ich es nicht fertig, das File X genau Name Y bekommt, was genau das Entscheidende ist.

Vielen Dank.

mfg Peti

[Edit Biber] Codeformatierung nachgezogen, weil es gar nicht lesbar war. [/Edit]

Content-Key: 192101

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

Printed on: April 23, 2024 at 15:04 o'clock

Member: Biber
Biber Oct 02, 2012 at 13:32:10 (UTC)
Goto Top
Moin DJPeti,

willkommen im Forum.

Mit zwei spiralförmig umeinander kreisenden Listen machst du dir die Arbeit unnötig schwer.

Prüfe erstmal, ob eine der folgenden varianten für deine Anforderung machbar ist:
  • entweder EINE Textdatei, die je Zeile <<"Altername"; "NeuerName">> enthält
  • oder EINE Textdatei, die nur <<"AlterName">> je Zeile enthält und die Nummerierung erfolgt fortlaufend ("001", "002" etc)

Grüße
Biber
Member: bastla
bastla Oct 02, 2012 updated at 16:13:41 (UTC)
Goto Top
... sehe ich grundsätzlich auch so - obwohl frei nach Friemler:
@echo off & setlocal
<2.txt (for /f "delims=" %%i in (1.txt) do (  
    set "Alt=%%i"  
    set /p "Neu="  
    setlocal enabledelayedexpansion
    echo ren "!Alt!.txt" "!Neu!.txt"  
    endlocal
))
[Edit] So angepasst, dass sowohl in "1.txt" als auch in "2.txt" Namen mit "!" enthalten sein dürfen. [/Edit]

Grüße
bastla
Member: Biber
Biber Oct 02, 2012 updated at 16:37:43 (UTC)
Goto Top
Moin bastla,

ja nee... sehr hybsch und ja durchaus robust.

Aber:
WTF sollte jemand im realen Leben so arbeiten wollen oder müssen, dass links eine 58119-Zeilen-Plaintext-Datei mit einem "AltNamen" pro Zeile rumliegt und dieser Jemand in eine neue zweite Plaintext-Datei (auf einem anderen Laufwerk vielleicht?) 58119 Zeilen mit "NeuNamen" eintippselt?

Das würde bei normal belastbaren Individuen in Zeile 194 schiefgehen - bei mir wäre spätestens in Zeile 23 Schicht.

Oder wenn dich in 2 Monaten der Cheffe anmailt mit "Du hast doch neulich die Datei "Heinz.txt" umbenannt - wie heisst die Datei denn heute?" - lässt du dich dann von deiner Outlook-Abwesenheitsassistentin verleugnen?

Ich würde nicht alles so ungestüm umsetzen, was nicht explizit gegen geltende Naturgesetze verstösst... oder zumindest einen Plan B ins Gespräch bringen.

Grüße
Biber
Member: bastla
bastla Oct 02, 2012 updated at 20:06:38 (UTC)
Goto Top
Hallo Biber!

Sehe ich weiterhin auch so (aber ein wenig Spielen muss manchmal sein face-wink) - wobei nach einer Umbenennung auf laufende Nummer der ursprüngliche Dateiname wohl kein Thema mehr sein dürfte; wenn das also wirklich so geplant ist, wäre die Datei "2.txt" nur eine Krücke - und die braucht's dann ja gar nicht:
@echo off & setlocal
set /a Nr=1001

for /f "delims=" %%i in (1.txt) do (  
    set "Alt=%%i"  
    setlocal enabledelayedexpansion
    echo ren "%Alt%.txt" !Nr:~-3!.txt  
    endlocal
    set /a Nr+=1
)
Grüße
bastla
Member: DJPeti
DJPeti Oct 03, 2012 at 08:05:13 (UTC)
Goto Top
Danke euch!

Funktioniert einwandfrei.

Habe mittlerweile selber nochmals bisschen ausprobiert und sowas hier gebastelt:

Inhalt 1.txt (aus Excel mit vb exportiert):

21010001_1400002 1400002 1400002_21010001
21010002_1400003 1400003 1400003_21010002
21010003_1400004 1400004 1400004_21010003

@echo off

set /p folder=Please enter folder for new Files C:\temp\:

md c:\temp\%folder%


FOR /F "tokens=1 delims=_ " %%a IN (1.txt) do for /f "tokens=2 delims= " %%b IN (1.txt) do if not exist C:\Temp\%folder%\%%b_%%a.txt copy C:\Temp\%%a.txt c:\Temp\%folder%\%%b_%%a.txt  
pause

FOR /F "tokens=3 delims= " %%x IN (1.txt) do copy C:\temp\%folder%\%%x.txt C:\Temp  


for /F "delims=" %%i in ('dir /b /a-D *.txt') do (for /F "delims=_" %%m in ('echo %%i') do ren "%%i" "%%m%%~xi")  
pause

Alle files werden erstellt (auch die unnötigen, die ich irgendwie mit dieser Schleife nicht umgehen kann). Dann werden die "richtigen" aussortiert und vom Temporären Ordner in den Überordner kopiert und dann wird der Name wieder gekürzt.

Funktioniert einigermassen, aber ist unnötig lang.