Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateien umbennen falls nummer schon vorhanden..

Frage Entwicklung Batch & Shell

Mitglied: minicoop

minicoop (Level 1) - Jetzt verbinden

29.01.2008, aktualisiert 30.01.2008, 3920 Aufrufe, 14 Kommentare

hallo,

ich bräuchte hilfe bei folgendem scenario:
annahme:
im verzeichnis c:\temp\
liegen dateien mit 000_xyz.dat wobei xyz im grunde fortlaufende nummern sind.
diese möchte ich in das verzeichnis c:\archiv verschieben.
bis hier ist es ja kein problem.
wenn aber in c:\archiv schon die datei existiert, soll die zu verschiebenden dateien hintendrangehängt werden.
also wenn zb im archiv die dateien von 000_000.dat bis 000_123.dat existieren,
und in c:\temp\ dateien mit 000_000.dat bis 000_009.dat liegen, sollen diese ab 000_124.dat anfangen und danach dorthin verschoben werden.

wäre für eure hilfe sehr dankbar.

gruss





[Edit Biber] ich hasse Umbennungen... nein, ich benn das jetzt nicht um...*grmpfff* [/Edit]
Mitglied: bastla
29.01.2008 um 14:26 Uhr
Hallo minicoop!

Etwa so:
01.
@echo off & setlocal 
02.
set "Source=C:\temp" 
03.
set "Target=C:\archiv" 
04.
set Prefix=000 
05.
set Delim=_ 
06.
set Ext=.dat 
07.
 
08.
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Target%\%Prefix%%Delim%*%Ext%"') do set N=%%i 
09.
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Source%\%Prefix%%Delim%*%Ext%"') do call :ProcessFile %%i 
10.
goto :eof 
11.
 
12.
:ProcessFile 
13.
set /a N+=1 
14.
set "No=00000%N%" 
15.
move "%Source%\%Prefix%%Delim%%1%Ext%" "%Target%\%Prefix%%Delim%%No:~-3%%Ext%"
Anmerkung: Die Stellenanzahl (3) für die laufende Nummer habe ich (in der letzten Zeile) konstant eingetragen, um nicht "delayedexpansion" verwenden zu müssen.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
29.01.2008 um 14:41 Uhr
Moin bastla,

[Fussnote]

Einen Unterschied bzw. einen Grund zur Unterscheidung von
01.
.. 
02.
set Prefix=000 
03.
set Delim=_ 
04.
..
...gibt es aber nicht, oder?

01.
set "Prefix=000_"
...wäre doch viel ressourcen- und damit klimaschonender. Oder übersehe ich etwas?
Bitte warten ..
Mitglied: bastla
29.01.2008 um 14:50 Uhr
@Biber

Einen Unterschied bzw. einen Grund zur Unterscheidung von ...gibt es aber nicht, oder?
Da ich %Delim% in den Schleifen verwende, eigentlich doch - insofern vielleicht eher
01.
set Part=000 
02.
set Delim=_ 
03.
 
04.
set Prefix=%Part%%Delim%
Grüße
bastla
Bitte warten ..
Mitglied: minicoop
29.01.2008 um 15:30 Uhr
hallo bastla,

sieht gut aus. vielen dank an euch alle.
bau jetzt noch ein wenig drumherum und bin dann fertig.

gruss
Bitte warten ..
Mitglied: minicoop
29.01.2008 um 16:51 Uhr
hallo bastla,

korrektur.
irgendwas scheint bei mir nicht ganz zu stimmen..

ist im target verzeichnis nichts drin, werden die dateien alle rübergemoved.
nehme ich dann meine 4 dateien aus dem target verzeichnis und kopiere sie nochmal ins source
verzeichnis und führe das script erneut aus, dann moved er mir die dateien korrekt rüber.
im ziel verzeichnis sind dann 000_001.dat bis 000_008.dat
nehme ich dann die acht dateien und kopier sie erneut ins source verzeichnis und führe das script aus,
werden die vorhandenen acht dateien dann überbügelt, nicht "hintendrangehängt"
komisch..
weisst du da einen rat ?
Bitte warten ..
Mitglied: bastla
29.01.2008 um 17:06 Uhr
Hallo minicoop!

Ändere die Zeile
01.
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Target%\%Prefix%%Delim%*%Ext%"') do set N=%%i
auf die folgenden Zeilen:
01.
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%Target%\%Prefix%%Delim%*%Ext%" 2^>nul') do set N=1%%i 
02.
set /a N-=1000 
03.
if %N% lss 0 set N=0
Erklärung: MS hatte die Königsidee, Oktalzahlen mit dem Präfix "0" zu versehen - daher werden "000" bis "007" richtig interpretiert, "008" aber nicht mehr. Das Ergebnis: Die höchste Zahl wird mit 0 ermittelt, und daher beginnt die Zählung von vorne und die vorhandenen Dateien werden überschrieben.

Solltest Du irgendwann mit dreistelligen Nummern nicht mehr auskommen, müsstest Du auch die Zeile
01.
set /a N-=1000
auf die höhere Stellenanzahl anpassen.

Grüße
bastla
Bitte warten ..
Mitglied: miniversum
29.01.2008 um 17:54 Uhr
Erklärung: MS hatte die Königsidee, Oktalzahlen mit dem Präfix "0" zu versehen
Ich glaub diese Idee stamt nicht von MS ;) . Das wurde denk ich mal eher aus Kompartiblitätsgründen übernommen.
Bitte warten ..
Mitglied: minicoop
29.01.2008 um 18:02 Uhr
hallo bastla,

vielen dank, jetzt sieht es besser aus.
hab jetzt nur noch ein letztes anliegen.
wenn ich
set "Source=C:\temp" ändere auf z.b.
set "Source=C:\Program Files" findet das verzeichnis nicht mehr.
war eigentlich immer der meinung, wenn ich das verzeichnis in hochkommata angebe, kann man in batches damit arbeiten.
habe dann gedacht ich arbeite mit dem kurznamen, aber der geht auch nicht bei mir.
ich mach jetzt feierabend.
bis morgen,

gruss
nedim
Bitte warten ..
Mitglied: bastla
29.01.2008 um 18:13 Uhr
Hallo minicoop!

set "Source=C:\Program Files" findet das verzeichnis nicht mehr.
Sollte eigentlich kein Problem sein - bei mir funktioniert's (mit dem von mir geposteten Code). Stell doch bitte Deine momentane Batchversion herein ...

@miniversum
Ich glaub diese Idee stamt nicht von MS ;)
Na dann geht's mir doch gleich wesentlich besser damit ...

Grüße
bastla
Bitte warten ..
Mitglied: minicoop
30.01.2008 um 11:15 Uhr
Guten Morgen,

anbei die batch..
wie gesagt, wenn ich meine quelle ändere, läuft sie durch. nehme ich meinen usb stick, geht nix..
01.
@echo on & setlocal 
02.
 
03.
REM Variablen setzen 
04.
 
05.
set "quelle=E:\externe Daten" 
06.
set "temp=C:\umbennen" 
07.
set "ziel=C:\Archiv" 
08.
set Prefix=000 
09.
set Delim=_ 
10.
set Ext=.dat 
11.
 
12.
REM Prüfung ob Ziel überhaupt vorhanden 
13.
if exist %quelle%\*%EXT% GOTO :LOS 
14.
GOTO :eof 
15.
 
16.
:LOS 
17.
REM und los .. 
18.
echo "Daten werden uebertragen.. Bitte warten" 
19.
c: 
20.
REM Daten werden erstmal weggemoved da quelle zu langsam. 
21.
if exist "%quelle%\*%EXT%" FOR /F "usebackq eol=; tokens=1,2* delims=: " %%i in (`Time /T`) do move "%quelle%\*%EXT%" %temp% 
22.
 
23.
cd %ziel% 
24.
REM Zielverzeichnis wird angelegt wenn nicht schon existent im format YYYY\MM.YYYY\TT 
25.
if exist "%temp%\*%EXT%" FOR /F "usebackq eol=; tokens=2,3,4* delims=. " %%i in (`Date /T`) do if not exist %%k\%%j.%%k\%%i mkdir %%k\%%j.%%k\%%i 
26.
FOR /F "usebackq eol=; tokens=2,3,4* delims=. " %%i in (`Date /T`) do cd %%k\%%j.%%k\%%i 
27.
FOR /F "usebackq eol=; tokens=2,3,4* delims=. " %%i in (`Date /T`) do set ziel1=%%k\%%j.%%k\%%i 
28.
 
29.
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%ZIEL%\%ZIEL1%\%Prefix%%Delim%*%Ext%" 2^>nul') do set N=1%%i 
30.
set /a N-=1000 
31.
if %N% lss 0 set N=0 
32.
for /f "tokens=2 delims=%Delim%." %%i in ('dir /b /on "%temp%\%Prefix%%Delim%*%Ext%"') do call :ProcessFile %%i 
33.
goto :eof 
34.
 
35.
:ProcessFile 
36.
set /a N+=1 
37.
set "No=00000%N%" 
38.
move "%temp%\%Prefix%%Delim%%1%Ext%" "%ziel%\%ziel1%\%Prefix%%Delim%%No:~-3%%Ext%"
Gruss
Nedim
Bitte warten ..
Mitglied: Biber
30.01.2008 um 11:27 Uhr
Moin Nedim,

schau Dir mal am CMD-Prompt die Hilfen zu "cd" und "PopD/PushD" jeweils mit "help cd" bzw "help pushd" etc. an.

Und ändere dann die Zeile
cd %ziel%
in
PushD "%ziel%"
...oder wenigstens (zweite Wahl) in ...
cd /d %ziel%

Aber versuch erst zu verstehen, was der Unterschied ist... sonst noch mal nachfragen.

Grüße
Biber
Bitte warten ..
Mitglied: minicoop
30.01.2008 um 15:10 Uhr
sorry biber,
hat ein wenig länger gedauert.
das mit der erweiterten shell war mir noch nicht bekannt..
muss doch gleich mal danach googlen was damit noch alles geht..
script funktioniert jetzt einwandfrei, bis auf die abfrage

REM Prüfung ob Ziel überhaupt vorhanden
if exist %quelle%\*%EXT% GOTO :LOS
GOTO :eof
das mag er irgendwie nicht so wirklich.
habe das jetzt weggemacht und er rennt durch.

wenn ich jetzt irgendwann auf 000_wxyz.dat gehen würde,
müsste ich set /a N-=1000 anpassen wie bastla geschrieben hat ?

Gruss
Nedim
Bitte warten ..
Mitglied: bastla
30.01.2008 um 15:32 Uhr
Hallo minicoop!

wenn ich jetzt irgendwann auf 000_wxyz.dat gehen würde, müsste ich set /a N-=1000 anpassen
Soferne Du mit "wxyz" vierstellige Nummern meinst: ja. Anzupassen wäre die "set"-Zeile auf
01.
set /a N-=10000
und die "move"-Zeile wäre dann
01.
move "%temp%\%Prefix%%Delim%%1%Ext%" "%ziel%\%ziel1%\%Prefix%%Delim%%No:~-4%%Ext%"
die abfrage ... REM Prüfung ob Ziel überhaupt vorhanden
... hätte ich zwar umgekehrt formuliert, also
01.
if not exist "%Quelle%\*%Ext%" goto :eof
aber wenn's nicht an den fehlenden Anführungszeichen gelegen sein sollte, wüsste ich im Moment auch nicht, wo's klemmt ...

Du könntest aber einmal ein "echo" vor die Zeile schreiben - dann wird sie nur angezeigt, und Du siehst hoffentlich, woran es scheitert.

Grüße
bastla
Bitte warten ..
Mitglied: minicoop
30.01.2008 um 16:00 Uhr
Hallo bastla,

das passt jetzt alles.
vielen dank für eure hilfe.
ich schliess dann mal den vorfall.

Gruss
Nedim
Bitte warten ..
Neuester Wissensbeitrag
DSL, VDSL

Telekom blockiert immer noch den Port 7547 in ihrem Netz

(3)

Erfahrungsbericht von joachim57 zum Thema DSL, VDSL ...

Ähnliche Inhalte
Batch & Shell
Dateien im Ordner auslesen und umbennen (10)

Frage von jocheng zum Thema Batch & Shell ...

Batch & Shell
gelöst Verschieben und Umbenennen von Video-Dateien anhand der Nummer im Namen (3)

Frage von Foja.Filmer zum Thema Batch & Shell ...

Windows 7
Kopierte Dateien im Hintergrund anzeigen (1)

Frage von MichiBLNN zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...