windows - Net gruppe output sortering

Indlæg af Hanne Mølgaard Plasc

Problem



Kommandoen net group "Groupname" /domain > c: empusers.txt vil generere følgende output i tekstfilen.


Group name     GroupABC
Comment        XXXXXXXXXXXXXXXXXXXXX

Members

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


Jeg har brug for at slippe af med den unødige overskrift og kommentar i slutningen af ​​filen og har simpelthen outputen i en ordnet liste som følger:


MemberA
MemberB
MemberC
MemberD
MemberE
MemberF
...


Er der en nem måde at gøre dette på uden at skulle udskrives til filen og fjerne overskriften manuelt? Din hjælp til sortering og fjernelse af unødvendig afstand er meget værdsat!

Bedste reference


@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


Jeg brugte en fil med navnet q47813094.txt, der indeholder dine data til min testning.


Naturligvis kan du erstatte "filename" med 'your command' og fjerne indstillingen usebackq for at behandle kommandoen direkte.


Hver linje behandles som \%\%a. Ved første er body udefineret, så indstillingen af ​​$... springes over. Når linjen med bindestreger er fundet, er body sat til Y (nogen ikke-tom værdi vil gøre) og så videre efterfølgende linjer er hvert medlem tildelt \%\%m og variablen $\%\%m indstillet til medlemsnavnet fundet. På den sidste linje registreres slutningen af ​​rapporten, som indstiller body til intet og derfor bliver den igen udefineret.


Brug derefter set på variabler, der starter $, som bekvemt vil returnere listen i alfabetisk rækkefølge.





For at erstatte originalfil:


(FOR/f 'tokens=1 * delims ==' \%\% a IN ('sæt $') DO ECHO \%\% b)> '\% filnavn1\%'


De vedhæftede parenteser forårsager, at omdirigereren samler det viste output og producerer en ny fil. Hvis der findes en eksisterende fil, vil denne fil blive erstattet.

Andre referencer 1




Det ser ud til, at net altid bruger tre 25 tegn brede kolonner. Så jeg skrev et lille script, der ikke bruger for /F til at dele linjerne på SPACEs , som også kan forekomme i nogle navne, men at opdele linjerne i stykker på 25 tegn med substreng udvidelse og fjern efterfølgende rum efterfølgende: [32]


@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


Denne fremgangsmåde tillader, at selv SPACEs vises i de returnerede navne, og det har ingen problemer med specialtegn (som ^, \%, !, [[&, ", (, ), <, >, |).