karstenpa
Goto Top

Batchdatei für das Erstellen eines Unterordner bei Vorhandensein eines bestimmten Ordnernamens

Hallo zusammen ,

ich suche nach einer Möglichkeit, ein freigegebenes Laufwerk nach einem bestimmten Ordnernamen ("Schriftverkehr") zu durchsuchen, und dann im folgenden in diesem Ordner einen weiteren Unterordner anzulegen. Dieser Ordner "Schriftverkehr" kommt in der Struktur mehrere hundert mal vor.

Das müsste doch eigentlich mit einer Batchdatei funktionieren ?

Darin bin ich wirklich nicht bewandert …. face-sad


Um keine Missverständnisse aufkommen zu lassen : Wir reden hier von einigen 10000 Unterordnern …….
(sonst hätt ich das längst per Hand gemacht.)


Vielleicht könnte mir da jemand weiterhelfen ??


Vielen Dank schon mal für die Aufmerksamkeit !!


K.

Content-Key: 420303

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

Ausgedruckt am: 19.03.2024 um 04:03 Uhr

Mitglied: Pedant
Pedant 21.02.2019 um 14:43:53 Uhr
Goto Top
Hallo KarstenPa,

nur als Ansatz:

Wenn das freigegebenes Laufwerk per Laufwerksbuchstaben [z.B. X:] verbunden ist, dann kannst Du auf das Laufwerk wechseln und nach dem Ordner suchen lassen.
x:
dir /ad /b /s Schriftverkehr

Das kannst Du in einer For-Schleife einsetzen und darin die Unterordner erstellen lassen.

Gruß Frank
Mitglied: Pjordorf
Pjordorf 21.02.2019 um 14:49:35 Uhr
Goto Top
Hallo,

Zitat von @KarstenPa:
und dann im folgenden in diesem Ordner einen weiteren Unterordner anzulegen. Dieser Ordner "Schriftverkehr" kommt in der Struktur mehrere hundert mal vor.
Soll der neu zu schaffende Unterordner nur einmal angelegt werden oder mehrere hundert mal?

Das müsste doch eigentlich mit einer Batchdatei funktionieren ?
Darf es auch evtl. Powershell sein?

Darin bin ich wirklich nicht bewandert …. face-sad
Deshalb sollen wir deine Arbeit machen?

Um keine Missverständnisse aufkommen zu lassen : Wir reden hier von einigen 10000 Unterordnern
Vielleicht könnte mir da jemand weiterhelfen ??
Was ist das Dateisystem bzw.OS?
Oder sind die Daten nur auf ein NAS oder so zu finden?

Gruß,
Peter
Mitglied: KarstenPa
KarstenPa 21.02.2019 um 14:58:46 Uhr
Goto Top
Hallo Peter,

niemand soll meine Arbeit machen …. Ich dachte nur, daß es vielleicht jemanden gibt, der sich sowas schon mal ausgedacht hat.
Warum etwas 2 x erfinden ?

Klar, das hab ich vergessen : Windows Server 2016 Standard, und es dürften nachher etwa 1500 Ordner sein.

Jede Lösung ist mir recht face-smile (auch PowerShell)


Danke

Karsten
Mitglied: KarstenPa
KarstenPa 21.02.2019 aktualisiert um 15:08:37 Uhr
Goto Top
hier hab ich mich jetzt mal vertan ..
Mitglied: Pjordorf
Pjordorf 21.02.2019 um 15:19:41 Uhr
Goto Top
Hallo,

Zitat von @KarstenPa:
Warum etwas 2 x erfinden ?
Warum etwas suchen wenn es das schon gibt? Damit nicht das rad 2 mal erfindet.
https://www.google.com/search?q=batch+finde+ordner+site%3Aadministrator. ... oder das Suchfenster oben rechts bemühen.

Jede Lösung ist mir recht face-smile (auch PowerShell)
face-smile

Gruß,
Peter
Mitglied: erikro
erikro 21.02.2019 um 15:46:02 Uhr
Goto Top
Moin,

mit der Powershell wie so oft ein Einzeiler, den Du im Stammverzeichnis der Ordner ausführst, in denen das passieren soll:

 gci -r | %{if($_.Name -eq "Schriftverkehr") {new-item -path "$_\unterordner" -itemtype directory}}  

hth

Erik
Mitglied: 138810
138810 21.02.2019 aktualisiert um 18:32:25 Uhr
Goto Top
Das müsste doch eigentlich mit einer Batchdatei funktionieren ?
Naturalemente ...

Batch
for /f "delims=" %%a in ('dir /b /s /ad "X:\Schriftverkehr"') do md "%%a\Unterordner"  
Powershell
gci x: -Directory -Recurse -Include "Schriftverkehr" | %{md "$($_.Fullname)\Unterordner" -Force -Verbose}  


Zitat von @erikro:
mit der Powershell wie so oft ein Einzeiler, den Du im Stammverzeichnis der Ordner ausführst, in denen das passieren soll:
 gci -r | %{if($_.Name -eq "Schriftverkehr") {new-item -path "$_\unterordner" -itemtype directory}}  
Das hat aber ein paar Fehler und performance issues ...

  1. Findet auch Dateien mit dem Namen statt nur Ordner
  2. Der Ordner wird nicht im jeweiligen Unterordner erstellt sondern im aktuellen Verzeichnis in einem Ordner Schriftverkehr (statt $_ solltest du hier "$($_.Fullname)\unterordner" nutzen)
  3. Ist das Konstrukt performancetechnisch ineffektiv da es alle Ordner und sogar Dateien durchläuft und dann auch noch das IF-Konstrukt durchläuft und die Ordner nicht vorher schon im Get-Childitem Befehl ausfiltert.
Mitglied: erikro
erikro 22.02.2019 um 10:19:34 Uhr
Goto Top
Moin,

Zitat von @138810:
Zitat von @erikro:
mit der Powershell wie so oft ein Einzeiler, den Du im Stammverzeichnis der Ordner ausführst, in denen das passieren soll:
 gci -r | %{if($_.Name -eq "Schriftverkehr") {new-item -path "$_\unterordner" -itemtype directory}}  
Das hat aber ein paar Fehler und performance issues ...

  1. Findet auch Dateien mit dem Namen statt nur Ordner

Da hast Du recht. Da muss noch ein -directory dahinter.

# Der Ordner wird nicht im jeweiligen Unterordner erstellt sondern im aktuellen Verzeichnis in einem Ordner Schriftverkehr (statt $_ solltest du hier "$($_.Fullname)\unterordner" nutzen)

Mist! Falsche Testversion kopiert. face-wink Da hast Du natürlich auch recht.

# Ist das Konstrukt performancetechnisch ineffektiv da es alle Ordner und sogar Dateien durchläuft und dann auch noch das IF-Konstrukt durchläuft und die Ordner nicht vorher schon im Get-Childitem Befehl ausfiltert.

Naja. Ich würde sogar noch weiter gehen und mit test-path prüfen, ob der zu erstellende Ordner schon existiert. Ob das dann zwei Sekunden länger dauert oder nicht, wäre mir egal.

Liebe Grüße

Erik
Mitglied: Pedant
Pedant 22.02.2019 um 13:05:38 Uhr
Goto Top
Hallo freesolo,

Zitat von @138810:
for /f "delims=" %%a in ('dir /b /s /ad "X:\Schriftverkehr"') do md "%%a\Unterordner">   
das hat noch einen Schönheitsfehler.
Der Laufwerksbuchstabe darf nicht beim dir dabei sein, sonst würde lediglich X:\Schriftverkehr gesucht und durchsucht werden und nicht alle Unterordner namens "Schriftverkehr" auf X: gesucht werden.

cd /d x:\
for /f "delims=" %%a in ('dir /b /s /ad "Schriftverkehr"') do md "%%a\Unterordner"> 

Gruß Frank
Mitglied: 77559
77559 22.02.2019 um 14:39:22 Uhr
Goto Top
Zitat von @Pedant:
das hat noch einen Schönheitsfehler.
Der Laufwerksbuchstabe darf nicht beim dir dabei sein, sonst würde lediglich X:\Schriftverkehr gesucht und durchsucht werden und nicht alle Unterordner namens "Schriftverkehr" auf X: gesucht werden.

Sorry aber das ist absoluter Lötzinn.

Mit der /S option wird der letzte Name rekursiv gesucht.

Ausgabe aus meinem Testverzeichnis

> dir q:\test\2018\13 /B /S /AD
q:\test\2018\04\13
q:\test\2018\05\13
q:\test\2018\06\13
q:\test\2018\07\13
q:\test\2018\08\13
q:\test\2018\11\13
q:\test\2018\12\13

Gruß
LotPings
Mitglied: Pjordorf
Pjordorf 22.02.2019 aktualisiert um 14:56:09 Uhr
Goto Top
Hallo,

Zitat von @77559:
Sorry aber das ist absoluter Lötzinn.
Nö, da hat er recht.

Mit der /S option wird der letzte Name rekursiv gesucht.
Ja, das werden sie, aber alle nur im Ausgangspfad. Siehe deine Ausgabe. Da ist nichts davon ausserhalb C:\test\2018\13\

Ausgabe aus meinem Testverzeichnis
Glaub ich nichtface-smile s.u.

dir q:\test\2018\13 /B /S /AD
Passt nämlich nicht zu deiner Ausgabe. Du lässt in q:\test\2018\13\ suchen, zeigst uns aber die Ausgabe von q:\test\2018\. Wie sonst kommen da sonst Verzeichnisse wie q:\test\2018\04 usw. zustande?

Gruß,
Peter
Mitglied: Pedant
Pedant 22.02.2019 um 16:02:48 Uhr
Goto Top
Hallo,

zuerst war ich auch "empört" und was ich schrieb funktioniert einwandfrei, aber LotPings' Beispiel funktioniert interessanterweise auch und dass obwohl der Pfad c:\test\2018\13 nicht existiert.

Ich habe diese Struktur angelegt:
c:\test\2018\04\13c:\test\2018\05\13c:\test\2018\06\13c:\test\2018\07\13c:\test\2018\08\13c:\test\2018\11\13c:\test\2018\12\13

Den Ordner c:\test\2018\13 habe ich nicht angelegt.
dir c:\test\2018\13 /b /ad (ohne /s)
=> Datei nicht gefunden

D:\>dir c:\test\2018\13 /b /s /ad
=> gibt tatsächlich die gesamte Liste aus, die dem Muster c:\test\2018\...\13 entspricht:

Lege ich zusätzlich noch diese Struktur an:
c:\brot\2018\04\13c:\brot\2018\05\13c:\brot\2018\06\13c:\brot\2018\07\13c:\brot\2018\08\13c:\brot\2018\11\13c:\brot\2018\12\13

und setze diesen Befehl ab:
dir c:\13 /b /s /ad
werden beide Strukturen gelistet.

Keine Ahnung was sich der dir-Befehl dabei denkt, die Pfadangabe zu splitten und "C:\" als Ausgansverzeichnis zu nehmen und "13" als Suchzeichenfolge.
Die Ausgabe von dir c:\13 /b /s /ad und dir 13 /b /s /ad ist identisch, wobei Letzterer erfordert, dass er C:\ als Arbeitsverzeichnis hat und Ersterer nicht.

Gruß Frank
Mitglied: erikro
erikro 22.02.2019 um 16:10:26 Uhr
Goto Top
Tatsächlich. Man glaubt es kaum. dir kann sowas wie regex. face-wink

P:\test>dir 2018 /b
02
03
04
01

P:\test>dir 2018\13 /s /ad /b
P:\test\2018\02\13
P:\test\2018\03\13
P:\test\2018\04\13
P:\test\2018\01\13

P:\test>mkdir 2018\04\13\13

P:\test>dir 2018\13 /s /ad /b
P:\test\2018\02\13
P:\test\2018\03\13
P:\test\2018\04\13
P:\test\2018\04\13\13
P:\test\2018\01\13
Mitglied: 138810
138810 22.02.2019 aktualisiert um 16:57:21 Uhr
Goto Top
Zitat von @Pedant:
Zitat von @138810:
for /f "delims=" %%a in ('dir /b /s /ad "X:\Schriftverkehr"') do md "%%a\Unterordner">   
das hat noch einen Schönheitsfehler.
Der Laufwerksbuchstabe darf nicht beim dir dabei sein, sonst würde lediglich X:\Schriftverkehr gesucht und durchsucht werden und nicht alle Unterordner namens "Schriftverkehr" auf X: gesucht werden.
Nö, das macht hier nichts, das /s sorgt dafür das auch das geht ! Hätte ich hier ja nicht gepostet wenn es nicht so wäre! Mach ich schon ewig und drei Tage so.
Mitglied: Pedant
Pedant 23.02.2019 um 12:26:35 Uhr
Goto Top
Hallo freesolo,

Zitat von @138810:
Hätte ich hier ja nicht gepostet wenn es nicht so wäre!
Gelegentlich schreibt man eine Lösung für eine einfache Aufgabe ohne sie getestet zu haben und schreibt einen kleinen Syntaxfehler mit rein.
Andere Male probiert man zwei oder drei Varianten aus, findet dabei die richtige, kopiert dann aber versehentlich die falsche in seine Antwort.

Zitat von @138810:
Nö, das macht hier nichts, das /s sorgt dafür, dass auch das geht
Ja, darauf hatte LotPings schon hingewiesen und ich hatte es daraufhin ausprobiert und zu meiner Überraschung hat es funktioniert.


Eines habe ich noch festgestellt:

Deine "merkwürdige" Syntax scheitert, wenn der Ordner X:\Schriftverkehr existieren sollte.
In dem Fall zeigt er lediglich - und so wie ich es generell erwarten würde - die Unterordner von C:\Schriftverkehr an oder eben nichts, falls C:\Schriftverkehr keine Unterordner hat.
C:\> md C:\Schriftverkehr
C:\> dir /b /s /ad X:\Schriftverkehr
=> X:\Schriftverkehr\Unterordner1
=> X:\Schriftverkehr\Unterordner2
Warum bei Deiner Syntax die Struktur von X:\ durchsucht wird, wenn X:\Schriftverkehr nicht vorhanden ist, ist mir echt unklar und ich halte es für einen Bug.

Die normale Syntax scheitert aber auch (in umgekehrter Weise).
Wenn Schriftverkehr in erster Ebene von X:\ existiert, so wird nicht, wie eigentlich angegeben, die Struktur von X:\ durchsucht, sondern lediglich die Struktur von X:\Schriftverkehr
C:\> cd /d X:\
X:\> md Schriftverkehr
X:\> dir /b /s /ad Schriftverkehr
=> X:\Schriftverkehr\Unterordner1
=> X:\Schriftverkehr\Unterordner2
Das halte ich ebenfalls für einen Bug.
Eigentlich sollte der Befehlt bedeuten:
Suche im aktuellen Verzeichnis des aktuellen Laufwerks nach Verzeichnissen mit dem Namen "Schriftverkehr" und zeige sie an und beziehe dabei die gesamte Unterstruktur des aktuellen Verzeichnisses des aktuellen Laufwerks mit ein.


Noch eine weitere Sache mit einem anderen Beispielordner:
Davon ausgehend dass (wie üblich) C:\System32 nicht existiert...
dir /b /s /ad C:\System32
=> C:\Windows\System32
versus
dir /b /s /ad C:\System32\
=> Das System kann die angegebene Datei nicht finden.
Jetzt weiß ich wenigstens, wie ich dieses merkwürdig Verhalten unterdrücken kann.


Ich möchte Dir noch erklären, warum ich Deine Syntax als merkwürdig und als Bug bezeichne:
Stell Dir vor der rd-Befehlt würde sich ebenso verhalten, was er glücklicherweise nicht tut.
Normal ist...
md C:\System32
=> der Ordner C:\System32 wird erzeugt
rd /q /s C:\System32
=> der Ordner C:\System32 wird ohne Nachfrage geleert und entfernt
rd /q /s C:\System32
=> Das System kann die angegebene Datei nicht finden. (ist auch kein Wunder, der Ordner wurde ja zuvor gelöscht)
So kennt man's und so ist es auch gut.
Merkwürdig wäre...
md C:\System32
=> der Ordner C:\System32 wird erzeugt
rd /q /s C:\System32
=> der Ordner C:\System32 wird ohne Nachfrage geleert und entfernt
rd /q /s C:\System32
=> Der Ordner C:\System32 existiert nicht, dann suche ich halt in der Struktur von C:\ nach System32-Ordnern.
=> C:\Windows\System32 wird ohne Nachfrage geleert und entfernt
So würde man es nicht erwarten und so will man es auch nicht haben.

Zitat von @138810:
Mach ich schon ewig und drei Tage so.
Wie und wann kamst Du denn darauf so eine kontraintuitive Syntax überhaupt auszuprobieren?

Merkwürdig und Bug oder nicht:
In Bezug auf KarstenPas Aufgabenstellung sind beide Syntaxvarianten funktionsgleich.
Deine Lösung funktioniert für ihn und er sollte seine Frage als gelöst markieren.

Gruß Frank