-1

Der Befehl net group "Groupname" /domain > c:\temp\users.txt generiert die folgende Ausgabe in der Textdatei.Netzgruppenausgabe Sortierung

Group name  GroupABC 
Comment  XXXXXXXXXXXXXXXXXXXXX 

Members 

-------------------------------------------------------------------- 
MemberA     MemberB     MemberC 
MemberD     MemberE     MemberF 
MemberG     MemberH     MemberI 
The command completed successfully. 

Ich würde müssen am Ende der Datei die Beseitigung der unnötigen Header und kommentieren bekommen und haben einfach die Ausgabe in einer Liste geordnet wie folgt:

MemberA 
MemberB 
MemberC 
MemberD 
MemberE 
MemberF 
... 

Gibt es eine einfache Möglichkeit, um dies zu tun, ohne in die Datei ausgeben zu müssen und den Header manuell zu entfernen? Ihre Hilfe beim Sortieren und Entfernen unnötiger Abstände wird sehr geschätzt!

+2

Warum haben Sie "[powershell]" markiert, aber Sie verwenden nicht "Get-ADGroupMember"? – TessellatingHeckler

+0

Argh, ich hatte gehofft, der 'net' Befehl ist intelligent genug, um seine mehrspaltige Ausgabe an eine einspaltige Ausgabe anzupassen, falls das Konsolenfenster schmaler wird, aber kein Glück, es scheint, dass' net' immer drei verwendet 25 Zeichen breite Spalten. Also schlage ich vor, 'for/F' nicht zu verwenden (und auf Leerzeichen zu spalten, die auch in manchen Namen vorkommen können), sondern die Zeilen in Stücke von 25 Zeichen aufzuteilen (nach [sub-string expansion] (http: // ss64). com/nt/syntax-substring.html) und entferne nachfolgende Leerzeichen ... – aschipfl

+0

Danke für deinen Vorschlag aschipfl.Ich bin neu, also würde es wirklich helfen, wenn Sie einen Beispiel-Sub-String-Erweiterungscode bereitstellen könnten. Danke ! – user618616

Antwort

1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q47813094.txt" 
:: remove variables starting $ 
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a=" 
SET "body=" 
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
REM detect last line 
IF "%%a"=="The command completed successfully." SET "body=" 
IF DEFINED body FOR %%m IN (%%a) DO SET "$%%m=%%m" 
REM detect start-of-body 
IF "%%a"=="--------------------------------------------------------------------" SET "body=y" 
) 
FOR /f "tokens=1*delims==" %%a IN ('set $') DO ECHO %%b 
GOTO :EOF 

verwendete ich eine Datei mit dem Namen q47813094.txt Ihre Daten für meinen Tests enthält.

Sie können natürlich "filename" durch 'your command' ersetzen und die Option usebackq entfernen, um den Befehl direkt zu verarbeiten.

Jede Zeile wird als %%a verarbeitet. Zunächst ist body nicht definiert, daher wird die Einstellung $... übersprungen. Wenn die Bindestrichzeile gefunden wird, wird body auf Y festgelegt (jeder nicht leere Wert wird ausgeführt) usw. In den folgenden Zeilen wird jedem Mitglied %%m zugewiesen und die Variable $%%m auf den gefundenen Mitgliedsnamen festgelegt. In der letzten Zeile wird das Ende des Berichts erkannt, das body auf nichts setzt, daher wird es wieder undefiniert.

Dann verwenden Sie set auf Variablen beginnend $, die bequem die Liste in alphabetischer Reihenfolge zurückgibt.


Um ursprüngliche Datei zu ersetzen:

(FOR/f "tokens = 1 * delims ==" %% a IN ('set $') DO ECHO %% b)> "% filename1% "

Die umschließenden Klammern bewirken, dass der Redirector die angezeigte Ausgabe sammelt und eine neue Datei erstellt. Wenn eine Datei vorhanden ist, wird diese Datei ersetzt.

+0

Dank Magoo scheint das Skript zu funktionieren und sortiert die Benutzer in alphabetischer Reihenfolge. Die Textdatei, die als Eingabe verwandt wird, wird jedoch nicht geändert. Gibt es eine Möglichkeit, die ursprüngliche .txt zu überschreiben? – user618616

0

Es scheint, dass net immer drei 25 Zeichen breite Spalten verwendet. Also schrieb ich ein kleines Skript, das nicht for /F nicht verwenden, um die Linien bei Spaces aufgeteilt, die auch in einigen Namen auftreten können, aber die Linien in Stücke von 25 Zeichen, die durch sub-string expansion und entfernen Sie Leerzeichen danach aufzuteilen:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_GROUP=GroupName" & rem // (define the group name here) 
set "_SPACES=    " & rem // (16 spaces) 

rem // Initialise variables: 
set "LINE=" & set "FLAG=" 
rem // Loop through all (non-empty) output lines of `net group`: 
for /F delims^=^ eol^= %%L in ('net group "%_GROUP%" /DOMAIN') do (
    rem // Toggle delayed expansion to avoid loss of or trouble with `!`: 
    setlocal EnableDelayedExpansion 
    rem // Query state of flag: 
    if defined FLAG (
     rem // Split the line string into three 25-character strings: 
     for /L %%P in (0,25,50) do (
      rem // Extract a single column item (a 25-character string): 
      set "COL=!LINE:~%%P,25!" 
      rem // Split off trailing space characters: 
      for %%S in (16 8 4 2 1) do (
       if defined COL (
        if "!COL:~-%%S!"=="!_SPACES:~,%%S!" (
         set "COL=!COL:~,-%%S!" 
        ) 
       ) 
      ) 
      rem // Return non-empty right-trimmed column item: 
      if defined COL echo(!COL! 
     ) 
    ) 
    rem // Set flag in case last header line is encountered (`-` only): 
    if "!LINE:-=!"=="" (endlocal & set "FLAG=#") else endlocal 
    rem /* Store currently read line to be processed in the next loop iteration; 
    rem this lets the last line be ignored, which is just a success message: */ 
    set "LINE=%%L" 
) 

endlocal 
exit /B 

Dieser Ansatz ermöglicht auch Spaces in den zurückgegebenen Namen erscheinen, und es hat keine Probleme mit Sonderzeichen (wie ^, %, !, &, ", (, ), <, >, |).

Verwandte Themen