gerry56
Goto Top

Namen der Unterverzeichnisse in verschiedene Variable einlesen mittels Batch

Hallo und ein schönes Wochenende.

Ich merke leider, daß ich schon länger nichts mehr mit DOS (Batch) erstellt habe.
Folgendes Problem

Ich möchte mittels Batch-Datei, die auf Win-XP, Win-Vista, Win-7 und Win-8 laufen soll, die Namen (Bezeichnung) von Unterverzeichnissen (Unterordnern) auslesen und Variablen zuweisen.

Die Anzahl und die Namen der Unterverzeichnisse sind nicht bekannt.

Da die Namen der Unterverzeichnisse für eine weitere Bearbeitung benötigt werden, wird für jede Unterordnerbezeichnung eine eigene Variable benötigt (z.B. "B" für das erste Verzeichnis, "C" für das zweite Verzeichnis usw.)

Ich habe schon verschiedene Varianten getestet.
Leider wird immer nur ein Wert der letzten Zeile vom DIR-Befehl in die Variable "benutz" übernommen
for /f "tokens=2*" %%B in ('dir /a:d %anwend%') do set benutz=%%B

Bei dieser Variante wird wiederum nur der letzte Verzeichniseintrag in die Variable "benutz" übernommen
for /f "tokens=*" %%B in ('dir /b %anwend%') do set benutz=%%B

Bitte um Hilfe
Danke im voraus
Gerry

Content-ID: 275175

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

Ausgedruckt am: 18.11.2024 um 09:11 Uhr

gerry56
gerry56 20.06.2015 um 22:06:28 Uhr
Goto Top
Hat denn niemand eine Ahnung wie das geht?

Ich habe schon Stunden im Internet gesucht.
Bei den Erklärungen und Beispielen wird das Ergebnis entweder in eine Datei geschrieben oder in eine einzige Variable.
Diese Erklärungen und Beispiele nützen mir leider nichts, da ich verschiedene Variable benötige.

Bitte um Hilfe, bin am verzweifeln
Gerry
rubberman
rubberman 20.06.2015 aktualisiert um 22:22:09 Uhr
Goto Top
Hallo Gerry,

in 99,9% aller Fälle ist es unsinnig riesige Strukturen in eine Unmenge von Variablen zu packen (was der Grund dafür sein könnte, dass die Google Ergebnisse so dürftig sind). Schließlich existiert diese Struktur ja bereits in Form des Dateisystems und irgendwann würden dir die Variablennamen ausgehen. Wenn du also ein wenig genauer erklärst was du letztlich bezwecken willst, findet sich vielleicht eine sinnvolle Alternative.

Grüße
rubberman
SarekHL
SarekHL 20.06.2015 um 22:39:51 Uhr
Goto Top
Zitat von @rubberman:

in 99,9% aller Fälle ist es unsinnig riesige Strukturen in eine Unmenge von Variablen zu packen (was der Grund dafür
sein könnte, dass die Google Ergebnisse so dürftig sind). Schließlich existiert diese Struktur ja bereits in Form
des Dateisystems und irgendwann würden dir die Variablennamen ausgehen.

Muss es Batch sein? Auch das hängt natürlich davon ab, was Du im nächsten Schritt mit dem Inhalt dieser Variablen machen willst, aber in VBS wäre Dein Anliegen kein Problem. Da gehen Dir auch nicht die Variablen aus, da Du mit einem Array arbeiten kannst.
gerry56
gerry56 20.06.2015 um 23:03:24 Uhr
Goto Top
Nun, ich möchte die Verzeichnisnamen der Benutzer eines Betriebssystems auslesen.

Z.B. bei Win-XP deutsche Version befindet sich im Verzeichnis "c:\Dokumente und Einstellungen" für jeden Benutzer 1 Unterverzeichnis mit dem Benutzernamen

Für Administrator gibt es das Unterverzeichnis Administrator,
für Benutzer Hans das Unterverzeichnis Hans
usw.

Da auf einem Privatsystem gerade einmal jedes Familienmitglied einen eigenen Benutzernamen hat,
bzw. in einem Kleinbetrieb eventuell Chef, Sekretärin und Admin,
wird es kein Problem mit den Variablennamen geben.

Gerry
rubberman
Lösung rubberman 20.06.2015 aktualisiert um 23:52:35 Uhr
Goto Top
Hallo Gerry,

ich gehe immer noch davon aus, dass das Speichern in Variablen unsinnig ist. Da du aber nichts darüber sagen willst, was letztlich bei der Aktion herauskommen soll, kann man dir dahingehend nicht helfen.

Wie auch immer. Du kannst ein assoziatives Array bauen. In diesem Fall mit den Variablen user_n, mit n = 1 bis Anzahl Profile.
@echo off &setlocal

for /f "tokens=1* delims=:" %%i in ('dir /ad /b "%userprofile%\..\*" ^|findstr /n .') do (  
  set "n=%%i"  
  set "user_%%i=%%j"  
)

:: Testausgabe
setlocal EnableDelayedExpansion
for /l %%i in (1,1,%n%) do echo !user_%%i!
pause
Grüße
rubberman
gerry56
gerry56 21.06.2015 um 00:14:37 Uhr
Goto Top
Hallo Rubberman

Vorerst einmal recht herzlichen Dank für deine rasche und kompetente Hilfe.

Wozu ich das brauche?

Nun, es ist ganz einfach.
Es gibt diverse Programme, die für jeden Benutzer eine eigene Datenbank anlegen, wobei es oft angenehmer wäre, wenn es nur eine Datenbank geben würde.
Weiters habe ich einige Computer zu betreuen, auf denen mehrere Betriebssysteme installiert sind.

Beispiel 1)
Das Programm WMP legt bei jedem Benutzer die Musikinformationsdatenbank an.
Wenn ich die Benutzerverzeichnisse kenne, kann ich in die Dateien von "C:\Dokumente und Einstellungen\Administrator\Lokale Einstellungen\Anwendungsdaten\Microsoft\Media Player" in ein neutrales Verzeichnis kopieren und bei jedem Benutzer löschen.
Danach lege ich bei jedem Benutzer einen Symlink (Junction) zum neutralen Verzeichnis.
Das hat zwei Vorteile
A) Es wird Speicherplatz gespart
B) Jeder Benutzer hat die selbe Musikinformationsdatenbank.

Beispiel 2)
Auch das Musikprogramm Creative Media Source legt pro Benutzer 1 Musikinfodatenbank an.
Hier kann man auch die Infos in ein neutrales Verzeichnis kopieren.
Danach legt man bei jedem Benutzer einen Symlink (Junction) zum neutralen Verzeichnis.
Da dieses Programm bei Win-XP bis Win-8 installiert werden kann, und bei jeder Win-Version der Datenbankaufbau ident ist,
kann man das neutrale Verzeichnis auf einer anderen Festplatte als das Betriebssystem installieren.
So kann die Musikinfodatenbank 1x angelegt werden, und jeder Benutzer greift bei jedem Betriebssystem auf die selbe Musikinformationsdatenbank zu.

Beispiel 3.)
Einstellungen für Adobe Acrobat,
Einstellungen von Magix Video pro
Die diversen Vorlagen der diversen Programme

Gerry
rubberman
rubberman 21.06.2015 um 00:41:46 Uhr
Goto Top
Hallo Gerry,

du kannst das alles in eine Subroutine packen und diese für jedes gefundene Profil aufrufen.
Bsp.:
@echo off &setlocal
for %%i in ("%userprofile%\..") do set "profiles=%%~fi"  
for /f "delims=" %%i in ('dir /ad /b "%userprofile%\..\*"') do (  
  set "profile=%profiles%\%%i"  
  call :processprofile
)
pause
exit /b


:processprofile
echo Mach was mit "%profile%" ...  
exit /b
Grüße
rubberman
gerry56
gerry56 21.06.2015 um 02:14:42 Uhr
Goto Top
Danke

Gerry