根据结果​​将批处理文件输出到文本文件

时间:2015-01-30 15:34:47

标签: windows batch-file cmd active-directory

我有一个批处理文件,用于检索Active Directory用户的值并提供诸如

之类的信息
Name : John
Country : US

Name : Jacob
Country : UK

然后将输出捕获到txt文件。如果国家/地区是英国,如何限制批处理文件仅输出结果。

3 个答案:

答案 0 :(得分:2)

Active Directory查询支持过滤。如果您通过在查询中包含国家/地区过滤器来表明您的意图并避免在其他答案中建议的某些复杂的变通方法,那么您的流程将更加高效。

如果您提供用于查询AD的API的指示,则可以更具体地回答这一问题。

Search Filter Syntax介绍了如何在查询中识别countries

一些Powershell示例供参考

答案 1 :(得分:1)

解决方案1使用FINDSTR(仅限本机批处理命令)

有一种模糊/未记录的技术,使用FINDSTR搜索标题“搜索换行符”标题下What are the undocumented features and limitations of the Windows FINDSTR command?描述的换行符。它涉及定义一个变量以包含换行符,然后将其包含在搜索词中。

假设您要对文本文件进行后期处理(我将其称为test.txt),那么您可以执行以下操作:

@echo off
setlocal enableDelayedExpansion

:: Define LF to contain a linefeed (0x0A)
set ^"LF=^

^" The above empty line is critical - DO NOT REMOVE

:: Output any line that precedes "Country : UK"
findstr /c:"!LF!Country : UK" test.txt >UK.txt

您可以将Active Directory查询命令的结果通过管道传输到FINDSTR并直接写出UK结果,而无需中间文件。首先,我假设您的脚本不需要延迟扩展。但FINDSTR确实需要延迟扩张。

管道的每一侧都在新的cmd.exe会话(线程?)中执行,并且延迟了扩展。必须通过带有/ V:ON参数的cmd执行FINDSTR才能打开延迟扩展:

@echo off
setlocal disableDelayedExpansion

:: Define LF to contain a linefeed (0x0A)
set ^"LF=^

^" The above empty line is critical - DO NOT REMOVE

:: Query Active Directory and only preserve lines that precede "Country : UK"
yourActiveDirectoryCommand|cmd /v:on /c findstr /c:"!LF!Country : UK"

如果您的脚本需要延迟扩展,那么您仍然必须通过cmd执行FINIDSTR并使用/ V:ON选项,但现在您还必须转义延迟扩展以使其不会过早扩展

@echo off
setlocal enableDelayedExpansion

:: Define LF to contain a linefeed (0x0A)
set ^"LF=^

^" The above empty line is critical - DO NOT REMOVE

:: Output any line that precedes "Country : UK"
yourActiveDirectoryCommand|cmd /v:on /c findstr /c:"^!LF^!Country : UK"

使用JREPL.BAT(混合JScript /批处理实用程序)

的解决方案2

JREPL.BAT是一个混合JScript /批处理实用程序,可以轻松执行正则表达式搜索并替换换行符。它是纯脚本,可​​以在XP以后的任何Windows机器上本机运行。

您可以对文件进行后期处理(同样,我正在使用test.txt)

call jrepl "^([^\r\n]*)\r?\nCountry : UK$" "$1" /jmatch /m /f test.txt /o UK.txt

或者您可以将Active Directory查询结果直接传递给JREN,并避免使用中间文件:

yourActiveDirectoryCommand|jrepl "^([^\r\n]*)\r?\nCountry : UK$" "$1" /jmatch /m /o UK.txt

答案 2 :(得分:1)

这是一个批处理代码,它要求您在输入块之前写入位于临时文件目录中的文件 ActiveDirectoryList.tmp

@echo off
setlocal EnableDelayedExpansion
set "DataFile=%TEMP%\ActiveDirectoryList.tmp"
set "OutputFile=ActiveDirectoryListUK.txt"

rem Delete the output file if it exists already.
if exist "%OutputFile%" del "%OutputFile%"

rem Parse the data file line by line and split up each line with colon and
rem space as separator. Loop variable A contains for input data either the
rem string "Name" or the string "Country" and everything after " : " is
rem assigned to loop variable B. If loop variable A is "Name", keep string
rem of loop variable B in an environment variable. If loop variable A and B
rem build the string "Country UK", write value of environment variable Name
rem determined before into the output file.

for /F "useback tokens=1* delims=: " %%A in ("%DataFile%") do (
    if "%%A" == "Name" (
        set "Name=%%B"
    ) else if "%%A %%B" == "Country UK" (
        echo Name: !Name!>>"%OutputFile%"
    )
)

del "%TEMP%\ActiveDirectoryList.tmp"
endlocal

当然也可以使用 for 命令直接解析活动目录查询的输出。