【问题标题】:Net group output sorting净组输出排序
【发布时间】:2017-12-14 12:11:11
【问题描述】:

net group "Groupname" /domain > c:\temp\users.txt 命令将在文本文件中生成以下输出。

Group name     GroupABC
Comment        XXXXXXXXXXXXXXXXXXXXX

Members

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

我需要去掉文件末尾不必要的标题和注释,只需将输出放在有序列表中,如下所示:

MemberA
MemberB
MemberC
MemberD
MemberE
MemberF
...

有没有一种简单的方法可以做到这一点,而不必手动输出到文件并删除标题?非常感谢您对排序和删除不必要间距的帮助!

【问题讨论】:

  • 为什么你标记了[powershell],但你没有使用Get-ADGroupMember
  • 啊,我希望net 命令足够智能,可以将其多列输出调整为单列输出,以防控制台窗口变得更窄,但似乎没有运气net 总是使用三个 25 个字符宽的列。所以我建议不要使用for /F(并在某些名称中也可能出现的空格处拆分),而是将行拆分为25个字符(通过sub-string expansion并在之后删除尾随空格...
  • 感谢您的建议 aschipfl。我是新手,所以如果你能提供一些示例子字符串扩展代码,那真的很有帮助。谢谢!
  • StackOverflow 仍然不是编码服务。我们非常愿意提供帮助,但您需要付出一些努力,以便我们可以在您尝试解决的任何解决方案的基础上进行构建。您有任何解决方案的尝试吗?
  • 我强烈建议不要使用 net.exe 和批处理文件来进行 AD 组管理。将 PowerShell 与 ActiveDirectory 模块或 DirectorySearcher 对象一起使用(如果您没有可用的模块)。或者使用 VBScript(例如,使用我的 ADQuery 类)。

标签: windows powershell batch-file command-line active-directory


【解决方案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

我使用了一个名为 q47813094.txt 的文件,其中包含我的测试数据。

当然,您可以将"filename" 替换为'your command' 并删除usebackq 选项以直接处理命令。

每一行都被处理为%%a。 AT 首先,body 是未定义的,所以 $... 的设置被跳过。当找到破折号行时,body 设置为 Y(任何非空值都可以),依此类推,每个成员都分配给%%m,变量$%%m 设置为成员-找到的名字。在最后一行,检测到报告结束,它将body 设置为nothing,因此它再次变为未定义。

然后在以$ 开头的变量上使用set,这将方便地按字母顺序返回列表。


替换原文件:

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

括号使重定向器收集显示的输出并生成一个新文件。如果存在现有文件,则该文件将被替换。

【讨论】:

  • 感谢 Magoo,该脚本似乎可以正常工作并按字母顺序对用户进行排序。但是,用作输入的文本文件不会被修改。有没有办法覆盖原来的.txt?
【解决方案2】:

net 似乎总是使用三个 25 个字符宽的列。所以我写了一个小脚本,它不使用for /F 来分割 SPACEs 处的行,这也可能出现在某些名称中,而是通过sub-string expansion 将行分割成 25 个字符并删除后面的空格:

@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

这种方法甚至允许 SPACEs 出现在返回的名称中,并且对于特殊字符(如^%!&"()<>|)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2015-12-04
    • 2014-05-25
    • 2019-06-08
    相关资源
    最近更新 更多