# [BATCH] Einzelne Datei suchen und umbenennen



## Salomonis (5. Februar 2008)

Hallo Community,

ich bin schon lange auf der Suche nach einem Batch-Code, der mir eine einzelne Datei unter Windows sucht und wenn er sie gefunden hat, umbenennt. Nur kriege ich das einfach nicht hin.

Bis jetzt habe ich es soweit gebracht:

```
rename c:\testdatei.txt /s testdatei1.txt
```

Testdatei.txt habe ich jetzt nur als Beispiel angeführt. Jedoch findet er die Datei, die er suchen soll, einfach nicht. Wenn ich den Befehl im CMD eingebe, kommt "Syntaxfehler".

Da mir hier einer weiterhelen?

MfG Salo


----------



## deepthroat (5. Februar 2008)

Hi.

Was meinst du denn mit "suchen"?

Der Syntaxfehler kommt daher, weil du die Syntax nicht eingehalten hast. Der rename Befehl besitzt keine Optionen: es gibt keine /s Option und der Befehl hat genau 2 Parameter. Siehe "help rename".

Gruß


----------



## Salomonis (5. Februar 2008)

Naja, mit "suchen" meine ich halt, dass er eine Datei, die in irgendeinem Ordner liegt (wo auch immer) sucht, findet und dann umbenennt.
Die Batch soll also die Festplatte nach dieser einzelnen Datei durchsuchen und wenn gefunden, umbenennen...


----------



## olqs (5. Februar 2008)

Einen Teil deines Batch Skriptes hast du ja schon gefunden, nämlich rename.

Jetzt brauchst du noch einen Befehl der dir die Datei sucht, z.B. 'dir' und etwas das mit dem Output von 'dir' dann was anfangen kann, z.B. eine for Schleife.

Wenn du die Hilfe zu 'for' und zu 'dir' durchliest, solllte das kein so ein Problem mehr sein.


----------



## Salomonis (5. Februar 2008)

Könnt ihr mir nicht einfach schnell den Code sagen? Wenn ich da wieder was finden soll, klapps am Ende eh wieder nicht...


----------



## olqs (5. Februar 2008)

Aber du wolltest es doch selbst hinbekommen, oder nicht?

Du hast gefragt, ob dir jemand weiterhelfen kann, weil du das nicht hinbekommst. Das haben wir gemacht. Ich seh da jetzt nicht wirklich die Tragik, wenn du deine Versuche hier postest und wir dann in Tipps geben.

Wenn du dann wieder mal ein Batch Skript brauchst, dann hast du schon einige Erfahrung damit und kannst es vielleicht komplett allein.


----------



## Salomonis (5. Februar 2008)

Aber ehrlich gesagt bin ich jetzt genau so schlau wie vorher... Wann muss ich denn den Befehl "dir" verwenden? Vielleicht:

```
@echo off
dir c:\Test.txt /s
ren test.txt test1.txt
```


----------



## olqs (6. Februar 2008)

Ok Schritt für Schritt 

Du wechselst erstmal in das Stammverzeichnis des Laufwerks, dass du durchsuchen willst

```
c:
cd \
```
oder
	
	
	



```
pushd c:\
```

danach brauchen wir 'dir'. Es soll rekursiv gesucht werden und nur die Dateinamen ausgegeben werden. 'dir /?' sollte da behilflich sein.

Diesen 'dir' Befehl setzen wir dann in ne for Schleife rein. Mal 'help for' und der Abschnitt über 'for /F'. Die Laufvariable muss einem Batch Skript immer mit 2 % Zeichen gekennzeichnet werden. Also %%i nicht %i wie in der Hilfe. Diese bezieht sich nämlich nur auf das ausführen direkt auf der Kommandozeile.

Wenn du mit der for Schleife geschafft hast, dir die Treffer einzeln auszugeben:

```
for /F %%i in (....) do echo %%i
```

Dann kannst du nen Schritt weitergehen und schaun wie du dein rename Kommando da noch einfügst.


----------



## crazymischl (11. Februar 2008)

Salomonis hast du die Lösung jetzt ?
Thread bitte als "gelöst" markieren !
Ansonsten:


```
@echo off
set dir=c:\ordner\
REM auf jedenfall ein \ am ende dran haben: >nicht< c:\ordner   sondern richtig>> c:\ordner\
set file=datei.txt
REM die zu suchende Datei (dateinamen anpassen, z.b. bild.jpg oder Dokument.doc)
for /r "%dir%" %%i in ("%file%") do if exist %%i (echo %%i >> log.txt && echo. >> log.txt && ren "%%i" "namen%%~xi")
pause
```

Erzeugt eine log-datei mit dem Pfad zum alten Namen, damit du weißt, wo die neue datei liegt.
Benennt die alte datei in "namen" (musst du noch anpassen) um, behält die dateiendung bei (durch %%~xi wird die datei-endung der original-datei automatisch an die umbenennte drangehängt).


----------



## Carsten Schermuly (9. März 2008)

Jaaa - ABER -

er sucht ja eine Datei, von der er nicht weiß wo sie liegt,
wüßte er das, brauchte er nicht nach ihr zu suchen,
so jedenfalls habe ich das Gespräch bisher verstanden.

Mein Senf dazu. 
Es müßte darum eine echte Suche sein, die rekursiv alle Directories durchläuft, bis gewünschte Datei gefunden wurde oder falls es mehrere Dateien deselben Namens gibt, bis alle gefunden wurden (z. B. mit APPEND).

Auf einem bestimmen Laufwerk suchen
Äh - mit drive.bat
---
C:\ 
call suche.bat

PAUSE

CLS
---
"call" bewirkt den Wechsel zu suche.bat, das Abarbeiten von suche.bat und das "zurück nach hier gehen" (in drive.bat), nachdem suche.bat abgearbeitet ist. "PAUSE" erlaubt, in aller Ruhe das Suchergebnis durchzugucken, das ja angezeigt wird ehe man durch "hit any key" weitergeht und mit CLS den Vorgang abschließt. Ohne "PAUSE" knallen manche Windows - Versionen das DOS - Fenster ungefragt zu - und dann steht man da, kratzt sich am Koppe und weiß nicht "Ja - äh - was war denn nun eigentlich los?". Darum ist es immer besser, vor CLS nochmal zu PAUSEieren.

suche bat könnte ungefähr so aussehen
---
:NOCHMALC
SUCHSCHLEIFE
wenn gefunden, Pfad anzeigen, Datei umbenennen und GOTO :NOCHMALC
wenn nicht gefunden, GOTO :WECHSELC
:WECHSELC
Auf ein anderes, hier bestimmtes Laufwerk "D:\" wechseln, dann wiederum
:NOCHMALD
SUCHSCHLEIFE
wenn gefunden, Pfad anzeigen, Datei umbenennen und GOTO :NOCHMALD
wenn nicht gefunden, GOTO :WECHSELD
:WECHSELD
usw - nächstes Laufwerk oder im LAN, eben anderer Computer.
---

Fast jede M$ Windows - Version sowie andere Systeme haben jeweils ein anderes DOS (oder gar keins und kommt wie mein Win 2000 nur mit vorgetäuschter DOS - Umgebung), darum funktionieren die Befehle unterschiedlich, resp deren Parameter werden unterschiedlich interpretiert. Die DOS - Commands ähneln sich zwar (Alle DOSen basieren auf dem ersten IBM DOS), das Suchergebnis fällt aber nicht immer gleich aus.

Der beste Weg - nach meinem Dafürhalten ist die Hilfe zum System.
START => Hilfe
Was ich an DOS - Tutorials im Internet fand, ist zwar von den Autoren gut gemeint (ist ja auch ein Akt der Zuvorkommenheit wenn jemand mal kostenlos hilft, gelle? Es ist ja nicht immer der Gedanke an mehr traffic damit verbunden.), es fehlen aber ausführbare Beispiele in den Tutorials.
Wer lernen will, kann unmöglich selbst die Commands und Parameter selber sinnvoll aufeinander abstimmen.

In die Suchmaske der System - Hilfe "DOS" tippen und nur wenig suchen und ausprobieren führt nicht nur zu erhebenden Aha - Erlebnissen, "DNNRWTTR, wieder etwas gelernt!", sondern macht auch tüchtig, sich selbst zu helfen wenn mal kein Forum zur Verfügung steht, in dem man Fragen stellen kann.


----------



## Carsten Schermuly (9. März 2008)

Wer mit seiner Hilfe vergleichen will - bitte -
Das Folgende ist ein Zitat aus der Hilfe zu M$ Windows 2000 Professional (WinNT 5)

---

*Append*
Ermöglicht Programmen das Öffnen von Datendateien in den angegebenen Ordnern, als wären diese Dateien im aktuellen Ordner gespeichert. 

Die angegebenen Ordner werden hinzugefügte Ordner (appended) genannt, da zu öffnende Dateien in ihnen so angesprochen werden können, als ob sie sich im aktuellen Verzeichnis befinden würden. 


```
append [;] [[Laufwerk:]Pfad[;...]] [[/x:{on | off}] [/path:{on | off}] [ /e]
```

Parameter

;

Löscht die Liste der hinzugefügten Ordner.

[[Laufwerk:]Pfad

Gibt das Laufwerk (falls es nicht das aktuelle ist) und den Ordner an, der dem aktuellen Ordner hinzugefügt werden soll. Sie können mehrere Einträge für [Laufwerk:]Pfad angeben, indem Sie die Einträge durch Semikolons ( voneinander trennen. Wird append allein verwendet, wird die bestehende Liste der hinzugefügten Ordner gelöscht. 

/x:{on | off}

Gibt an, ob das MS-DOS-Teilsystem bei der Ausführung von Programmen die hinzugefügten Ordner durchsuchen soll. Wenn Sie den Schalter /xn verwenden, werden auch hinzugefügte Ordner durchsucht. Wenn Sie den Schalter /xff verwenden, werden hinzugefügte Ordner nicht durchsucht. Sie können /xn mit /x abkürzen. Wenn Sie /xn angeben möchten, müssen Sie dies bei der ersten Verwendung von append nach dem Start des Systems durchführen. Danach können Sie zwischen /xn und /xff wechseln. 

/path:{on | off}

Gibt an, ob ein Programm hinzugefügte Ordner nach einer Datendatei durchsuchen soll, wenn bereits ein Pfad im Namen der gesuchten Datei enthalten ist. Die Standardeinstellung ist /pathn. 

/e 

Weist einer Umgebungsvariablen mit dem Namen append die Liste der hinzugefügten Ordner zu. Dieser Parameter kann nur bei der ersten Verwendung von append nach dem Start des Systems angegeben werden. Wenn Sie /e verwenden, können Sie mit dem Befehl set die Liste der hinzugefügten Ordner anzeigen. Weitere Informationen über Umgebungsvariablen erhalten Sie, indem Sie in der Liste Siehe auch auf set klicken. 

Siehe auch 
---

"Siehe auch" ist ein Link und führt u. A. zu "APPEND - Beispielen",
womit man dann ja tatsächlich nur noch auf die Füße fallen kann.


----------



## crazymischl (9. März 2008)

Carsten Schermuly hat gesagt.:


> er sucht ja eine Datei, von der er nicht weiß wo sie liegt,


Er kann doch einfach in meiner Batch als "ordner" den Laufwerkpfad angeben, und die Batch durchsucht automatisch alle ordner und unterordner auf C:\ :


crazymischl hat gesagt.:


> ```
> @echo off
> set dir=c:\
> set file=datei.txt
> ...



PS: Das Thema ist doch schon 1 Monat alt, bitte in Zukunft keine alten Themen mehr "ausgraben", denn wenn der Fragesteller noch eine Frage hätte, würde er sich melden....


----------



## Carsten Schermuly (9. März 2008)

OK - ich hab' nicht auf das Datum geachtet.
Mir fiel auf, daß das Thema nicht beendet war, z. B. durch einen Satz wie "Ist erledigt, ich habe eine Lösung gefunden" oder Ähnliches.
Anfänglich sah ich die Möglichkeit zur Lösung mit thefreedictionairy.

Wie Du siehst, nehme ich noch nicht lange an diesem Forum teil, da ist mir so etwas natürlich nicht geläufig - "bei Antworten auf's Darum achten".
Darum hoffe ich, daß es nur kleine Fettnäpfchen waren, in die ich trat.

Zur Entschädigung gibt es einen Blick nach Südafrika, da ist jetzt Herbst.
Ich war vor 20 Jahren dort (Johannesburg und Swaziland) und einer meiner Söhne war letztes Jahr dort (Kapstadt und östlich davon), von ihm sind die Fotos.


----------



## Dwza (5. Januar 2009)

lange rede kurzer sinn...
(auch wenns nun schon einige zeit her ist und wahrscheinlich nicht mehr gebraucht wird)


```
@pushd \
cd\
dir /S /B /A: H S R A \ | FIND /I "dateiname.xyz"
@popd
```


oder um die batch mit einem parameter (welcher natürlich der dateiname ist) aufzurufen


```
@pushd \
cd\
dir /S /B /A: H S R A \ | FIND /I "%1"
@popd
```

viel spaß damit 

ps: sucht alle datein die vorhanden sind. auf allen laufwerken.
anschließend wechselt es in das verzeichnis in dem was gefunden wurde.
speichern der information ist ein anderes thema *gg* denke nun kann man das "alte" thema schließen ^^


----------



## kraftzwerg (24. Februar 2009)

Auch wenn der Beitrag schon etwas älter ist,  so möchte ich ihn dennoch neu auskramen.
Dies ist der einzige Thread welcher Sinnvolle ideen zum Thema anbietet, auch der eizige Thread welcher mich zu einer Forenanmeldung brachte.

Ich habe ein ähnliches script geschrieben.
Es soll mir in einem Netzwerk sämtliche pst dateien finden und in einen Lokalen Ordner kopieren.
Es funktioniert auch alles wunderbar, nur mit einem Hacken:

*Es wird jeweils nur die erste gefundene Datei kopiert. Im erstellten log Eintrag wiederrum stehen alle gefundenen Dateien.
*
Ich bin da schon seid dem Wochenende am verzweifeln warum das kopieren nicht richtig geht.

Das Problem ist das uns der Exchange weg geflogen ist, und wir schnell die lokalen ost dateien brauchen. Die Datensicherung ist leider auch put :-(

Am Anfang des Scriptes werden Variablen zur Suche definiert.
Es wird ein Netzlaufwerk zum suchen verbunden (Dos macht kein UNC) und der Ordner angegeben.

*Das Problem tritt in der for Schleife auf.
mkdir und echo funktioniert so wie es soll (mehrere durchläufe bei mehreren Dateien) copy kopiert nur den ersten Fund. *

Am Ende des Scriptes wird der zu suchende Rechnername geändert, und das Script erneut durchlaufen.


Wer Das Script mal testen will, braucht nur die Variablen am Anfang, und die if Schleifen am ende modifizieren


```
@echo off

:VARIABLEN
REM Name des Rechners für den ersten Schleifendurchlauf:
set "PCNAME=PC1"

REM Zu durchsuchender Ordner
set "SDIR=\Dokumente und Einstellungen"

REM Zu suchende Datei
set "FILE=*.ost"

REM Dieses Netzlaufwerk wird zur Suche gemountet
set "NETDRIVE=y:"

REM Ordner in den das Backup kopiert werden soll
set "BACKUPPATH=d:\outlooksave\ost"

REM Name des Logfiles
set "LOGFILE=d:\outlooksave\ost\log.txt"

:BEGIN

cls
echo "aktueller pc: %PCNAME%"
ping -n 1 -w 999 %PCNAME%

if %errorlevel% EQU 1 goto NEXT

net use %NETDRIVE% \\%PCNAME%\c$

for /r "%NETDRIVE%%SDIR%" %%i in ("%FILE%") do if exist %%i (echo %PCNAME% >> %LOGFILE% && echo. %%i >> %LOGFILE% && if not exist %BACKUPPATH%\%PCNAME% (mkdir %BACKUPPATH%\%PCNAME%) && copy "%%i" %BACKUPPATH%\%PCNAME%\)



net use /delete %NETDRIVE%

:NEXT

if "%PCNAME%"=="PC1" (
    set PCNAME=PC2
    goto BEGIN
)

if "%PCNAME%"=="PC2" (
    set PCNAME=PC3
    goto BEGIN
)

:EXIT
echo "--> fertig <--"
pause
```


Hat jemand eine Idee warum das kopieren nicht richtig geht?
Ich bange, hoffe und Danke
mfg
Kraftzwerg


----------



## deepthroat (24. Februar 2009)

Hi.

Das Problem ist, das die Anweisungen falsch geklammert sind.

Es erfolgt keine Ausgabe hierbei:

```
if "a"=="b" (echo gleich) && echo nein
```
Hierbei wird "nein" ausgegeben:

```
(if "a"=="b" echo gleich) && echo nein
```

Das nur 1 Mal kopiert wird liegt daran, das das Backupverzeichnis beim ersten Durchlauf noch nicht existiert und deshalb die if not exist Bedingung wahr ist. Somit wird dann mkdir und bei Erfolg dann auch copy aufgerufen.

Und warum prüfst du ständig in der Schleife ob das Backupverzeichnis existiert? Das kannst du doch vorher erledigen.

Gruß

PS: Evtl. solltest du lieber eine CALL Anweisung in der Schleife verwenden, das macht das ganze übersichtlicher.


----------



## kraftzwerg (24. Februar 2009)

Vielen Vielen Dank deepthroat

Ich habe die if bedingung zum Ordner erstellen aus der for schleife ausgegliedert.
Dadurch entstehen zwar auch leere Ordner, aber beide Dateien werden dafür kopiert.
Mit call werde ich mich später befassen, jetzt muß das Script erstmal die knapp 100 Rechner scannen.
Dank call wärs nicht nur übersichtlicher, sondern auch leichter erweiterbar.
Ein Script welches nicht nach dem einmaligen gebrauch in der Tonne verschwindet 

Danke nochmal für die schnelle Antwort

Wer noch interessiert ist, hier ist mein Script: (die for schleife ist eine Modifikation von crazymischl´s for Schleife)


```
@echo off

:VARIABLEN
REM Name des Rechners für den ersten Schleifendurchlauf:
set "PCNAME=PC1"

REM Zu durchsuchender Ordner
set "SDIR=\Dokumente und Einstellungen"

REM Zu suchende Datei
set "FILE=*.ost"

REM Dieses Netzlaufwerk wird zur Suche gemountet
set "NETDRIVE=y:"

REM Ordner in den das Backup kopiert werden soll
set "BACKUPPATH=d:\outlooksave\ost"

REM Name des Logfiles
set "LOGFILE=d:\outlooksave\ost\ost_log.txt"

:BEGIN

cls
echo "aktueller pc: %PCNAME%"
ping -n 1 -w 999 %PCNAME%

if %errorlevel% EQU 1 goto NEXT

net use %NETDRIVE% \\%PCNAME%\c$

if not exist %BACKUPPATH%\%PCNAME% (mkdir %BACKUPPATH%\%PCNAME%) 

for /r "%NETDRIVE%%SDIR%" %%i in ("%FILE%") do if exist %%i (echo %PCNAME% >> %LOGFILE% && echo. %%i >> %LOGFILE% && copy "%%i" %BACKUPPATH%\%PCNAME%\)



net use /delete %NETDRIVE%

:NEXT

if "%PCNAME%"=="PC1" (
    set PCNAME=PC2
    goto BEGIN
)

if "%PCNAME%"=="PC2" (
    set PCNAME=PC3
    goto BEGIN
)

:EXIT
echo "--> fertig <--"
pause
```

mfg
Kraftzwerg


----------



## Irschen (12. August 2013)

Hallo

Ich weiß das Thema ist schon älter aber passt so ziemlich zu dem was ich Suche
Problem.

Ich bin ein KOMPLETTER Neuling im Thema programmieren etc.

Ich möchte dateien in einem bestimmten/festgelegten ordner finden und umbenennen

beispiel

00123456 sollen die ersten beiden stellen 00 entfernt werden

nehme ich dafür einfach

@echo off

rename c:\Test\00123456 /s 123456

bzw

rename c:\Test\00%%%%%% /s xxx.yyy.%%%%%%

die zahlen sind immer bzw jedesmal anders es sollen nur die ersten beiden stellen gelöscht werden

BEISPIEL:

00123456
ändern in xxx.yy.123456

wie gesagt die zahlen sind immer unterschiedlich


----------

