Problem bei Batch Code (betreffend AD)
Hallo,
ich habe folgendes Problem. Ich soll mit einer Batch Datei aus dem AD die Owner einer Gruppe (sind in der Beschreibung aufgelistet), alle Gruppen die dem Owner gehören und sämtliche Mitglieder dieser Gruppen in Owner-abhängige .txt Dateien auslesen und speichern. Ich bin nun soweit, dass ich die Owner auslesen und in Dateien speichern kann, allerdings erstellt er pro gefundenen Owner eine neue .txt Datei.
Das Problem ist dabei, wenn ich nun 3 Gruppen mit dem gleichen Owner (z.B. Owner: Müller) habe, dann erstellt er mir auch 3 .txt Dateien... Ich möchte aber eine .txt für jeden Owner, in dieser .txt Datei sollten dann alle Gruppen mit Membern aufgelistet werden.
Mein Code sieht wie folgt aus:
Über Hilfe wäre ich sehr dankbar (Powershell, VBS, etc. kommen nicht in Frage, nur Batch (DOS, Win2k3 Server).
Gruß
ich habe folgendes Problem. Ich soll mit einer Batch Datei aus dem AD die Owner einer Gruppe (sind in der Beschreibung aufgelistet), alle Gruppen die dem Owner gehören und sämtliche Mitglieder dieser Gruppen in Owner-abhängige .txt Dateien auslesen und speichern. Ich bin nun soweit, dass ich die Owner auslesen und in Dateien speichern kann, allerdings erstellt er pro gefundenen Owner eine neue .txt Datei.
Das Problem ist dabei, wenn ich nun 3 Gruppen mit dem gleichen Owner (z.B. Owner: Müller) habe, dann erstellt er mir auch 3 .txt Dateien... Ich möchte aber eine .txt für jeden Owner, in dieser .txt Datei sollten dann alle Gruppen mit Membern aufgelistet werden.
Mein Code sieht wie folgt aus:
@ECHO OFF & setlocal enabledelayedexpansion
dsquery group "Pfad,Domain" -limit 400 | dsget group -desc > DescriptionList.txt
SET /a num=0
FOR /F "delims=" %%a IN (DescriptionList.txt) DO CALL :ausgabe "%%a"
ECHO.
ECHO Anzeige der erzeugten Variablen:
SET v
PAUSE
GOTO :eof
:ausgabe
SET /a num=%num%+1
ECHO Textzeile ist %1
ECHO Zeilennummer=%num%
SET var%num%=%1
ECHO Variableninhalt=!var%num%!
ECHO !var%num%! | findstr "Owner">NUL
IF not errorlevel 1 ECHO !var%num%! > Owner_var%num%.txt
Über Hilfe wäre ich sehr dankbar (Powershell, VBS, etc. kommen nicht in Frage, nur Batch (DOS, Win2k3 Server).
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 197336
Url: https://administrator.de/contentid/197336
Ausgedruckt am: 25.11.2024 um 09:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo narthan!
Ändere versuchsweise die letzte Zeile auf
BTW: Wozu speicherst Du alle Zeilen in einzelnen Variablen?
Grüße
bastla
P.S.: "Code"-Formatierung lässt sich auch nachträglich noch anwenden ...
Ändere versuchsweise die letzte Zeile auf
IF not errorlevel 1 ECHO !var%num%! >>Owner_var%num%.txt
Grüße
bastla
P.S.: "Code"-Formatierung lässt sich auch nachträglich noch anwenden ...
Hallo narthan!
Wie sieht denn (schematisch) eine solche Zeile mit "Owner" aus?
versucht?
Grüße
bastla
[Edit] schließenden Apostroph ergänzt [/Edit]
Wie sieht denn (schematisch) eine solche Zeile mit "Owner" aus?
Ich musste die "Descriptions" in eine Datei speichern
Hast Du schon malFOR /F "delims=" %%a IN ('dsquery group "Pfad,Domain" -limit 400 ^| dsget group -desc ^| findstr "Owner"') DO echo "%%a"
Grüße
bastla
[Edit] schließenden Apostroph ergänzt [/Edit]
Hallo narthan!
damit Du Dir einmal die Ausgabe ansehen kannst.
Was Du dann damit vorhast, leuchtet mir noch nicht so ganz ein, denn Dein ursprünglicher Ansatz würde ja nach Deiner Beschreibung versuchen, Dateien wie "Owner_Owner: Max Mustermann.txt" mit dem Inhalt "Owner: Max Mustermann" zu erzeugen - sieht nicht sehr informativ aus ...
Vielleicht holst Du noch etwas weiter aus und postest die ersten paar Zeilen (für zB 3 Gruppen) Deiner "DescriptionList.txt" und das gewünschte Resultat.
Grüße
bastla
..führt leider zu einem Fehler
Hab's schon gesehen - der schließende Apostroph hat gefehlt (ist jetzt oben nachgetragen).passiert auch nichts mit den Dateien. :/
Soll es ja ohnehin nicht - da steht ja nur ein simplesecho "%%a"
Was Du dann damit vorhast, leuchtet mir noch nicht so ganz ein, denn Dein ursprünglicher Ansatz würde ja nach Deiner Beschreibung versuchen, Dateien wie "Owner_Owner: Max Mustermann.txt" mit dem Inhalt "Owner: Max Mustermann" zu erzeugen - sieht nicht sehr informativ aus ...
Vielleicht holst Du noch etwas weiter aus und postest die ersten paar Zeilen (für zB 3 Gruppen) Deiner "DescriptionList.txt" und das gewünschte Resultat.
Grüße
bastla
Hallo narthan!
Dann wäre das eher so zu lösen (weitgehend ungetestet):
Grüße
bastla
Dann wäre das eher so zu lösen (weitgehend ungetestet):
@echo off & setlocal
::Gruppen ermitteln und einzeln im Unterprogramm ":ProcessGroup" weiterverarbeiten
for /f "delims=" %%a in ('dsquery group "Pfad,Domain" -limit 400') do call :ProcessGroup "%%a"
:: Batch hier beenden
goto :eof
:ProcessGroup
:: Gruppe steht in %1
:: Owner auslesen (steht nach erstem ":" und " " und kann Leerzeichen enthalten)
for /f "tokens=1* delims=: " %%i in ('dsget group %1 -desc ^| findstr "Owner"') do set "Owner=%%j"
:: Dateinamen (ohne Leerzeichen + ".txt") erstellen
set "File=%Owner: =%.txt"
:: Gruppennamen ermitteln (steht nach "CN" und "=" und vor ",")
for /f "tokens=2 delims==," %%i in (%1) do set "Group=%%i"
:: Gruppeninfo in Datei schreiben
setlocal enabledelayedexpansion
:: Owner nur beim Erstellen der Datei eintragen
if not exist "%File%" >>"%File%" echo Owner: %Owner%
>>"%File%" echo Gruppe %Group%:
endlocal
:: Gruppenmitglieder ermitteln und eintragen
for /f "tokens=2 delims==," %%i in ('dsget group %1 -members') do >>"%File%" echo - %%i
:: Leerzeile eintragen
>>"%File%" echo(
:: Rücksprung in das Hauptprogramm
goto :eof
bastla
Hallo narthan!
Da ja der von "
Zur Sicherheit solltest Du noch Zeile 10 durch
ersetzen.
... und wie gesagt: Batches testest Du am besten direkt aus einer CMD-Shell (und wenn's wo klemmt, mit "
Grüße
bastla
Da ja der von "
dsquery
" gelieferte LDAP-Pfad bereits unter Anführungszeichen steht, sind die in der Zeile 3 zusätzlich Gesetzten leider etwas viel des Guten - versuch es mit ohne:for /f "delims=" %%a in ('dsquery group "Pfad,Domain" -limit 400') do call :ProcessGroup %%a
set "Owner="
for /f "tokens=1* delims=: " %%i in ('dsget group %1 -desc ^| findstr "Owner"') do set "Owner=%%j"
if not defined Owner echo %1 - kein Owner & goto :eof
... und wie gesagt: Batches testest Du am besten direkt aus einer CMD-Shell (und wenn's wo klemmt, mit "
echo on
" anstatt "echo off
"); wenn Du dann noch vorweg in den Eigenschaften des CMD-Fensters (Register "Layout") die Höhe der "Fensterpuffergröße" auf den Maximalwert von 9999 gesetzt hast, kannst Du in aller Ruhe nach oben scrollen und Dir sowohl Befehle als auch Ausgaben der einzelnen Batch-Zeilen ansehen ...Grüße
bastla