1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[BATCH] Einzelne Datei suchen und umbenennen

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von Salomonis, 5. Februar 2008.

  1. Salomonis

    Salomonis Grünschnabel

    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:
    Code (Text):
    1. 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
     
  2. deepthroat

    deepthroat Erfahrenes Mitglied

    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ß
     
  3. Salomonis

    Salomonis Grünschnabel

    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...
     
  4. olqs

    olqs Erfahrenes Mitglied

    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.
     
  5. Salomonis

    Salomonis Grünschnabel

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

    olqs Erfahrenes Mitglied

    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.
     
  7. Salomonis

    Salomonis Grünschnabel

    Aber ehrlich gesagt bin ich jetzt genau so schlau wie vorher... Wann muss ich denn den Befehl "dir" verwenden? Vielleicht:
    Code (Text):
    1. @echo off
    2. dir c:\Test.txt /s
    3. ren test.txt test1.txt
     
  8. olqs

    olqs Erfahrenes Mitglied

    Ok Schritt für Schritt :)

    Du wechselst erstmal in das Stammverzeichnis des Laufwerks, dass du durchsuchen willst
    Code (Text):
    1. c:
    2. cd \
    oder
    Code (Text):
    1. 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:
    Code (Text):
    1.  for /F %%i in (....) do echo %%i
    Dann kannst du nen Schritt weitergehen und schaun wie du dein rename Kommando da noch einfügst.
     
  9. crazymischl

    crazymischl Erfahrenes Mitglied

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

    Code (Text):
    1. @echo off
    2. set dir=c:\ordner\
    3. REM auf jedenfall ein \ am ende dran haben: >nicht< c:\ordner   sondern richtig>> c:\ordner\
    4. set file=datei.txt
    5. REM die zu suchende Datei (dateinamen anpassen, z.b. bild.jpg oder Dokument.doc)
    6. for /r "%dir%" %%i in ("%file%") do if exist %%i (echo %%i >> log.txt && echo. >> log.txt && ren "%%i" "namen%%~xi")
    7. 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).
     
  10. Carsten Schermuly

    Carsten Schermuly Grünschnabel

    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.
     
    Zuletzt bearbeitet: 9. März 2008
  11. Carsten Schermuly

    Carsten Schermuly Grünschnabel

    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.

    Code (Text):
    1. 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 /x:eek:n verwenden, werden auch hinzugefügte Ordner durchsucht. Wenn Sie den Schalter /x:eek:ff verwenden, werden hinzugefügte Ordner nicht durchsucht. Sie können /x:eek:n mit /x abkürzen. Wenn Sie /x:eek:n 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 /x:eek:n und /x:eek:ff 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 /path:eek:n.

    /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.
     
  12. crazymischl

    crazymischl Erfahrenes Mitglied

    Er kann doch einfach in meiner Batch als "ordner" den Laufwerkpfad angeben, und die Batch durchsucht automatisch alle ordner und unterordner auf C:\ :
    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....
     
  13. Carsten Schermuly

    Carsten Schermuly Grünschnabel

    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.
     

    Anhänge:

  14. Dwza

    Dwza Grünschnabel

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

    Code (Text):
    1. @pushd \
    2. cd\
    3. dir /S /B /A: H S R A \ | FIND /I "dateiname.xyz"
    4. @popd

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

    Code (Text):
    1. @pushd \
    2. cd\
    3. dir /S /B /A: H S R A \ | FIND /I "%1"
    4. @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 :D
     
    Zuletzt bearbeitet: 5. Januar 2009
  15. kraftzwerg

    kraftzwerg Gast

    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

    Code (Text):
    1. @echo off
    2.  
    3. :VARIABLEN
    4. REM Name des Rechners für den ersten Schleifendurchlauf:
    5. set "PCNAME=PC1"
    6.  
    7. REM Zu durchsuchender Ordner
    8. set "SDIR=\Dokumente und Einstellungen"
    9.  
    10. REM Zu suchende Datei
    11. set "FILE=*.ost"
    12.  
    13. REM Dieses Netzlaufwerk wird zur Suche gemountet
    14. set "NETDRIVE=y:"
    15.  
    16. REM Ordner in den das Backup kopiert werden soll
    17. set "BACKUPPATH=d:\outlooksave\ost"
    18.  
    19. REM Name des Logfiles
    20. set "LOGFILE=d:\outlooksave\ost\log.txt"
    21.  
    22. :BEGIN
    23.  
    24. cls
    25. echo "aktueller pc: %PCNAME%"
    26. ping -n 1 -w 999 %PCNAME%
    27.  
    28. if %errorlevel% EQU 1 goto NEXT
    29.  
    30. net use %NETDRIVE% \\%PCNAME%\c$
    31.  
    32. 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%\)
    33.  
    34.  
    35.  
    36. net use /delete %NETDRIVE%
    37.  
    38. :NEXT
    39.  
    40. if "%PCNAME%"=="PC1" (
    41.     set PCNAME=PC2
    42.     goto BEGIN
    43. )
    44.  
    45. if "%PCNAME%"=="PC2" (
    46.     set PCNAME=PC3
    47.     goto BEGIN
    48. )
    49.  
    50. :EXIT
    51. echo "--> fertig <--"
    52. pause

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

    deepthroat Erfahrenes Mitglied

    Hi.

    Das Problem ist, das die Anweisungen falsch geklammert sind.

    Es erfolgt keine Ausgabe hierbei:
    Code (Text):
    1. if "a"=="b" (echo gleich) && echo nein
    Hierbei wird "nein" ausgegeben:
    Code (Text):
    1. (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.
     
    Zuletzt bearbeitet: 24. Februar 2009
  17. kraftzwerg

    kraftzwerg Gast

    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)

    Code (Text):
    1. @echo off
    2.  
    3. :VARIABLEN
    4. REM Name des Rechners für den ersten Schleifendurchlauf:
    5. set "PCNAME=PC1"
    6.  
    7. REM Zu durchsuchender Ordner
    8. set "SDIR=\Dokumente und Einstellungen"
    9.  
    10. REM Zu suchende Datei
    11. set "FILE=*.ost"
    12.  
    13. REM Dieses Netzlaufwerk wird zur Suche gemountet
    14. set "NETDRIVE=y:"
    15.  
    16. REM Ordner in den das Backup kopiert werden soll
    17. set "BACKUPPATH=d:\outlooksave\ost"
    18.  
    19. REM Name des Logfiles
    20. set "LOGFILE=d:\outlooksave\ost\ost_log.txt"
    21.  
    22. :BEGIN
    23.  
    24. cls
    25. echo "aktueller pc: %PCNAME%"
    26. ping -n 1 -w 999 %PCNAME%
    27.  
    28. if %errorlevel% EQU 1 goto NEXT
    29.  
    30. net use %NETDRIVE% \\%PCNAME%\c$
    31.  
    32. if not exist %BACKUPPATH%\%PCNAME% (mkdir %BACKUPPATH%\%PCNAME%)
    33.  
    34. for /r "%NETDRIVE%%SDIR%" %%i in ("%FILE%") do if exist %%i (echo %PCNAME% >> %LOGFILE% && echo. %%i >> %LOGFILE% && copy "%%i" %BACKUPPATH%\%PCNAME%\)
    35.  
    36.  
    37.  
    38. net use /delete %NETDRIVE%
    39.  
    40. :NEXT
    41.  
    42. if "%PCNAME%"=="PC1" (
    43.     set PCNAME=PC2
    44.     goto BEGIN
    45. )
    46.  
    47. if "%PCNAME%"=="PC2" (
    48.     set PCNAME=PC3
    49.     goto BEGIN
    50. )
    51.  
    52. :EXIT
    53. echo "--> fertig <--"
    54. pause
    mfg
    Kraftzwerg
     
    Zuletzt von einem Moderator bearbeitet: 24. Februar 2009
  18. Irschen

    Irschen Grünschnabel

    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
     
    Zuletzt bearbeitet: 12. August 2013
Die Seite wird geladen...