bartosch
Goto Top

Zweites Zeichen bei Ordnern und Unterordner ersetzten durch Batch

Hallo zusammen, ich hab ein kleines Problem und ich hoffe ihr könnt mir helfen.

Problembeschreibung:

Ich habe eine leere Ordnerstruktur mit vielen Unterordnern die sehr verzweigt sind. (2500 ordner)

Ich würde gerne eine batch schreiben die sich jeden Ordner anschaut und wenn sie an zweiter Stelle (nur an zweiter Stelle) die zahl 4 findet durch die zahl 5 ersetzt.

Da ich fast keine Erfahrung diesbezüglich habe, hab ich schon Probleme beim Ansatz.

DANKE
bartosch

Content-Key: 171080

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

Printed on: April 18, 2024 at 06:04 o'clock

Mitglied: 60730
60730 Aug 08, 2011 at 08:57:05 (UTC)
Goto Top
Moin,

such doch mal im Forum nach bestimmtes Zeichen in Verzeichnis ersetzen.

Da sollte doch was für dich dabei sein.

Gruß
Member: Friemler
Friemler Aug 08, 2011 at 09:18:48 (UTC)
Goto Top
Hallo bartosch,

das sollte so gehen:
@echo off & setlocal

set "SrcDir=E:\Test"  

for /d /r "%SrcDir%" %%d in ("?4*.*") do (  
  set "DirPath=%%d"  
  set "DirName=%%~nxd"  
  call :ProcessDir
)

exit /b


:ProcessDir
  set "DirName=%DirName:~0,1%5%DirName:~2%"  
  ren "%DirPath%" "%DirName%"  
exit /b

In Zeile 3 das Verzeichnis eintragen, das die Verzeichnisstruktur enthält.

[EDIT]
ACHTUNG! Das Script funktioniert nur, wenn kein Explorerfenster geöffnet ist, in dem kurz vor Ausführung des Scripts durch die zu bearbeitende Verzeichnisstruktur gebrowst wurde. Siehe die folgenden Postings.

Ansonsten hat User Skyemugen eine zwar langsamere aber immer funktionierende Lösung gepostet, mittlerweile ziemlich ans Ende des Threads gerutscht.
[/EDIT]

Gruß
Friemler
Member: Skyemugen
Skyemugen Aug 08, 2011 at 09:45:52 (UTC)
Goto Top
Aloha,

ich hätte da auch etwas im Angebot: dat dauert 'n bissl - getestet mit 8 Hauptordnern und jeweils 6 Ebenen
@echo off & setlocal
set "Pfad=E:\Skripte\Ablage"  

pushd "%Pfad%"  
@for /f "delims=" %%s in ('dir /b /ad') do call :Tauchen "%%s"  
popd
pause
exit /b

:Tauchen
pushd "%~1"  
@for /f "delims=" %%s in ('dir /b /ad') do call :Tauchen "%%s"  
set "Ebene=%cd%"  
set "Ordner=%~1"  
popd
call :Ablauf "%Ordner%"  
goto :eof

:Ablauf
set "Name=%~1"  
set "Neu=%Name:~1,1%"  
if "%Neu%" EQU "4" ren "%Ebene%" "%Name:~0,1%5%Name:~2%"  
goto :eof

Eventuell ein wenig umständlich aber so ist das bei mir eben face-wink dafür ist es getestet und funktionsfähig.
Die Schwierigkeit ist ja hierbei, dass erst die Child-Ordner umbenannt werden und dann die Parent-Ordner, sonst find' der nix mehr, darum rattert mein Skript auch erst bis zur Unendlichkeit durch und arbeitet sich dann wieder nach oben hin, etwas schlaueres fällt mir auf 'nem Montag erst einmal nicht ein. ^_^

Hm aber mit Suchmaske sollte natürlich schneller sein, muss ich noch einmal testen, ich trau diesen Suchmasken nicht immer ^_^ Lieber doch nicht, dann werden keine Verzeichnisse mehr durchsucht, die dem nicht entsprechen aber eventuell deren Unterordnern, also belass' ich es dabei.

greetz André
Member: bartosch
bartosch Aug 08, 2011 at 11:17:24 (UTC)
Goto Top
@Friemler
Hi Danke, habe es ausprobiert passiert aber nix. Es ist auch meiner Meinung nach viel zu schnell, wenn ich die bat aufrufe ist sie schon fertig allerdings ohne Ergebnis.
Member: Friemler
Friemler Aug 08, 2011 at 11:50:23 (UTC)
Goto Top
Hallo bartosch,

ich habe nur oberflächlich getestet. Ab einer gewissen Verschachtelungstiefe von umzubenennenden Verzeichnissen funktioniert das Script nicht mehr. Nimm das Script von Skyemugen.

Ich hänge mal eine Verzeichnisstruktur an, bei der es teilweise funktioniert hat, teilweise nicht.
<code type="plain>
E:\TEST
├───14test Fehler
│ ├───14test Fehler
│ │ ├───14test Fehler
│ │ │ ├───15test Erfolg
│ │ │ └───16test
│ │ └───16test
│ │ ├───15test Erfolg
│ │ └───16test
│ └───16test
│ ├───14test Fehler
│ │ ├───15test Erfolg
│ │ └───16test
│ └───16test
│ ├───15test Erfolg
│ └───16test
└───16test Interessant wird es ab hier
├───15test Erfolg
│ ├───15test Erfolg
│ │ ├───15test Erfolg
│ │ └───16test
│ └───16test
│ ├───15test Erfolg
│ └───16test
└───16test
├───15test Erfolg
│ ├───15test Erfolg
│ └───16test
└───16test
├───15test Erfolg
└───16test


[EDIT]
Und wie immer gilt: Batchfiles, die nicht machen, was sie sollen, aus einem Konsolenfenster starten und nicht per Doppelklick, damit man auch die Ausgaben sieht. Und zum debuggen zusätzlich noch das ECHO OFF rausnehmen, dann sieht man auch, in welcher Reihenfolge und mit welchem Inhalt die einzelnen Zeilen ausgeführt werden.

Komisch, jetzt funktioniert das Script mit der obigen Verzeichnisstruktur. Hmm, Kopf kratz....
[/EDIT]

Gruß
Friemler
Member: Skyemugen
Skyemugen Aug 08, 2011 at 12:00:03 (UTC)
Goto Top
Aloha Friemler,

stimmt, fiel mir vorhin auf, irgendwann ist ihm der Pfadname zu lang und wird aber leer dargestellt, bei mir hatte er gar nichts umbenannt, sondern gleich den Fehler ausgespuckt, witzigerweise läuft dein Skript jetzt durch, ohne Probleme, durch die ganze Struktur *grübel* hattest du etwas am Code editiert noch? Habe eben neu c&p, davor lief es definitiv nicht.

greetz André

P.S.: So Kombinationen wie /d /r sind mir immer noch spanisch ;D
Member: Friemler
Friemler Aug 08, 2011 at 12:10:56 (UTC)
Goto Top
Hallo André,

nein ich habe nichts geändert, aber gerade die gleiche Erfahrung wie Du gemacht (es läuft face-smile ).

[EDIT]
Nach ein paar Tests komme ich zu dem Ergebnis, dass der Erfolg oder Misserfolg des Scripts davon abhängt, ob ein Explorerfenster, mit dem kurz vorher durch die zu bearbeitende Verzeichnisstruktur gebrowst wurde, offen ist oder nicht. (Noch mehr Kopf kratz...)

Beispiel
Folgende Verzeichnisstruktur:
E:\TEST
├───14test
│   ├───14test
│   │   ├───14test
│   │   │   ├───14test
│   │   │   │   ├───14test
│   │   │   │   │   ├───14test
│   │   │   │   │   └───16test
│   │   │   │   └───16test
│   │   │   │       ├───14test
│   │   │   │       └───16test
│   │   │   └───16test
│   │   │       ├───14test
│   │   │       │   ├───14test
│   │   │       │   └───16test
│   │   │       └───16test
│   │   │           ├───14test
│   │   │           └───16test
│   │   └───16test
│   │       ├───14test
│   │       │   ├───14test
│   │       │   │   ├───14test
│   │       │   │   └───16test
│   │       │   └───16test
│   │       │       ├───14test
│   │       │       └───16test
│   │       └───16test
│   │           ├───14test
│   │           │   ├───14test
│   │           │   └───16test
│   │           └───16test
│   │               ├───14test
│   │               └───16test
│   └───16test
│       ├───14test
│       │   ├───14test
│       │   │   ├───14test
│       │   │   │   ├───14test
│       │   │   │   └───16test
│       │   │   └───16test
│       │   │       ├───14test
│       │   │       └───16test
│       │   └───16test
│       │       ├───14test
│       │       │   ├───14test
│       │       │   └───16test
│       │       └───16test
│       │           ├───14test
│       │           └───16test
│       └───16test
│           ├───14test
│           │   ├───14test
│           │   │   ├───14test
│           │   │   └───16test
│           │   └───16test
│           │       ├───14test
│           │       └───16test
│           │           ├───14test
│           │           └───16test
│           └───16test
│               ├───14test
│               │   ├───14test
│               │   └───16test
│               └───16test
│                   ├───14test
│                   └───16test
└───16test
    ├───14test
    │   ├───14test
    │   │   ├───14test
    │   │   │   ├───14test
    │   │   │   │   ├───14test
    │   │   │   │   └───16test
    │   │   │   └───16test
    │   │   │       ├───14test
    │   │   │       └───16test
    │   │   └───16test
    │   │       ├───14test
    │   │       │   ├───14test
    │   │       │   └───16test
    │   │       └───16test
    │   │           ├───14test
    │   │           └───16test
    │   └───16test
    │       ├───14test
    │       │   ├───14test
    │       │   │   ├───14test
    │       │   │   └───16test
    │       │   └───16test
    │       │       ├───14test
    │       │       └───16test
    │       └───16test
    │           ├───14test
    │           │   ├───14test
    │           │   └───16test
    │           └───16test
    │               ├───14test
    │               └───16test
    └───16test
        ├───14test
        │   ├───14test
        │   │   ├───14test
        │   │   │   ├───14test   <- Bis zu diesem Verzeichnis im Explorer durchklicken
        │   │   │   └───16test
        │   │   └───16test
        │   │       ├───14test
        │   │       └───16test
        │   └───16test
        │       ├───14test
        │       │   ├───14test
        │       │   └───16test
        │       └───16test
        │           ├───14test
        │           └───16test
        └───16test
            ├───14test
            │   ├───14test
            │   │   ├───14test
            │   │   └───16test
            │   └───16test
            │       ├───14test
            │       └───16test
            │           ├───14test
            │           └───16test
            └───16test
                ├───14test
                │   ├───14test
                │   └───16test
                └───16test
                    ├───14test
                    └───16test

  • Explorer öffnen und bis zum folgenden Verzeichnis durchklicken:
E:\Test\16test\16test\14test\14test\14test\14test
Man ist dann im oben markierten Verzeichnis.

  • Jetzt im Explorerfenster ins Wurzelverzeichnis von E: wechseln, auch in der Baumansicht links alle Unterzweige von E: schließen.

  • Script aus Konsolenfenster starten -> 3 Fehlermeldungen "Zugriff verweigert"

  • Ergebnis des Scriptlaufs:
E:\TEST
├───15test
│   ├───15test
│   │   ├───15test
│   │   │   ├───15test
│   │   │   │   ├───15test
│   │   │   │   │   ├───15test
│   │   │   │   │   └───16test
│   │   │   │   └───16test
│   │   │   │       ├───15test
│   │   │   │       └───16test
│   │   │   └───16test
│   │   │       ├───15test
│   │   │       │   ├───15test
│   │   │       │   └───16test
│   │   │       └───16test
│   │   │           ├───15test
│   │   │           └───16test
│   │   └───16test
│   │       ├───15test
│   │       │   ├───15test
│   │       │   │   ├───15test
│   │       │   │   └───16test
│   │       │   └───16test
│   │       │       ├───15test
│   │       │       └───16test
│   │       └───16test
│   │           ├───15test
│   │           │   ├───15test
│   │           │   └───16test
│   │           └───16test
│   │               ├───15test
│   │               └───16test
│   └───16test
│       ├───15test
│       │   ├───15test
│       │   │   ├───15test
│       │   │   │   ├───15test
│       │   │   │   └───16test
│       │   │   └───16test
│       │   │       ├───15test
│       │   │       └───16test
│       │   └───16test
│       │       ├───15test
│       │       │   ├───15test
│       │       │   └───16test
│       │       └───16test
│       │           ├───15test
│       │           └───16test
│       └───16test
│           ├───15test
│           │   ├───15test
│           │   │   ├───15test
│           │   │   └───16test
│           │   └───16test
│           │       ├───15test
│           │       └───16test
│           │           ├───15test
│           │           └───16test
│           └───16test
│               ├───15test
│               │   ├───15test
│               │   └───16test
│               └───16test
│                   ├───15test
│                   └───16test
└───16test
    ├───15test
    │   ├───15test
    │   │   ├───15test
    │   │   │   ├───15test
    │   │   │   │   ├───15test
    │   │   │   │   └───16test
    │   │   │   └───16test
    │   │   │       ├───15test
    │   │   │       └───16test
    │   │   └───16test
    │   │       ├───15test
    │   │       │   ├───15test
    │   │       │   └───16test
    │   │       └───16test
    │   │           ├───15test
    │   │           └───16test
    │   └───16test
    │       ├───15test
    │       │   ├───15test
    │       │   │   ├───15test
    │       │   │   └───16test
    │       │   └───16test
    │       │       ├───15test
    │       │       └───16test
    │       └───16test
    │           ├───15test
    │           │   ├───15test
    │           │   └───16test
    │           └───16test
    │               ├───15test
    │               └───16test
    └───16test
        ├───14test                    <- Diese Verzeichnisse wurden eben geöffnet
        │   ├───14test                <-
        │   │   ├───14test            <-
        │   │   │   ├───15test        <- Hier hat es funktioniert
        │   │   │   └───16test
        │   │   └───16test
        │   │       ├───15test
        │   │       └───16test
        │   └───16test
        │       ├───15test
        │       │   ├───15test
        │       │   └───16test
        │       └───16test
        │           ├───15test
        │           └───16test
        └───16test
            ├───15test
            │   ├───15test
            │   │   ├───15test
            │   │   └───16test
            │   └───16test
            │       ├───15test
            │       └───16test
            │           ├───15test
            │           └───16test
            └───16test
                ├───15test
                │   ├───15test
                │   └───16test
                └───16test
                    ├───15test
                    └───16test

  • Explorerfenster schließen

  • Script nochmals starten

  • Keine Fehlermeldung, Verzeichnisse wurden umbenannt.


Fazit
Da spielt wohl der Verzeichniscache des Explorers eine Rolle.

[/EDIT]

Gruß
Friemler
Member: bartosch
bartosch Aug 08, 2011 at 13:29:11 (UTC)
Goto Top
DANKE, soweit ich das beurteilen kann hat das Script alles umbenannt.
Member: Friemler
Friemler Aug 08, 2011 at 14:00:27 (UTC)
Goto Top
Hallo André,

ich habe herausgefunden, woran es lag, siehe mein Edit in diesem Posting.

Gruß
Friemler
Member: Skyemugen
Skyemugen Aug 08, 2011 at 14:02:43 (UTC)
Goto Top
Aloha Friemler,

alter Falter, worauf wir demnächst beim Bätscheln wohl noch so achten müssen(?).

Wer kommt auf die Idee vorher den Explorer zu schließen, damit der Cache frei ist ... wtf.

Dann schreibe mal für die Nachwelt noch ein echo soundso ins Skript, damit das keiner übersieht :D

greetz André
Member: Skyemugen
Skyemugen Aug 08, 2011 at 14:03:44 (UTC)
Goto Top
Aloha,

2500 Ordner, hm? Mich würde mal interessieren, wie lange das Skript am Laufen war :D

greetz André
Member: bartosch
bartosch Aug 08, 2011 at 14:08:45 (UTC)
Goto Top
Nicht so lange nicht alle Ordner hatten ne 4 an zweiter Stelle ich hab nicht auf die Uhr geschaut aber nach gefühlten 10min war die Sache erledigt.
Member: Skyemugen
Skyemugen Aug 08, 2011 at 14:21:05 (UTC)
Goto Top
Aloha,

na immerhin, das Zeitaufwendigste ist eben der Vergleich der zweiten Stelle per if aber die Hauptsache ist, dass es funktioniert face-wink

greetz André
Member: pieh-ejdsch
pieh-ejdsch Aug 17, 2011 at 11:08:10 (UTC)
Goto Top
moin Andrè,

warum sehe ich den T erst jetzt? Na lieber spät als nie.

wenn erst der Tiefste Ordner Umbenannt wird bist Du immer auf der Sicheren Seite.
Frimlers Script mit For /d /r ... da werden die Ordner sicher "on the Fly" in die Variablen gesetzt und der Pfad ist demnach immer Aktuell
anders beim dir wo ja praktisch ein Abild für "offline" ensteht.

Timo (oder Lot) hatte die Sortierung mal so gelöst
Dir /ad /b /s D:\ |sort /r

zuvor hatte ich die Verzeichnisse anders Vorsortiert
Ersetzen von Zeichen in Datei- und Verzeichnisnamen in allen Unterordnern
das in der Marke :u müsste mit dem Ersetzt werden:
setlocal enabledelayedexpansion
if "!new:~1,1!" == "4" set "new=!new:~0,1!5!new~2!"  
endlocal&set "new=%new%"  
und mit Paramtetern Pfad\Ordner /d /u starten

aber Deins und Friemlers ist dafür schön Kurz.

das ein Ordner nicht umbenannt werden kann wenn er offen ist weis ja jeder aber wenn der Explorer noch offen ist und der Pfad nicht mehr aktuell ... ? Grübel

Gruß Phil