我有一个batch file,它检索Active Directory用户的值,并提供如下信息
Name : John Country : US Name : Jacob Country : UK
输出然后捕获到一个txt文件。 如果国家是英国,我怎样才能限制batch file输出结果?
活动目录查询支持筛选。 如果您通过在查询中包含国家/地区过滤器来指示您的意图,那么您的流程将会更加高效,并避免在其他答案中提出的复杂的解决方法。
如果您提供了用于查询AD的API的指示,则可以更具体地回答这个问题。
搜索过滤器语法描述如何识别查询中的国家 。
一些Powershell的例子供参考
有一个模糊的/没有记录的技术使用FINDSTR来搜索在什么是Windows FINDSTR命令的未记录的功能和限制描述的换行符? 在“跨越分行搜索”的标题下。 它涉及定义一个变量来包含换行字符,然后将其包含在搜索词中。
假设你想要后处理文本文件(我将它称为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,并直接写出英国的结果,而不需要中间文件。 首先我会假设你的脚本不需要延迟扩展。 但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 /批处理实用程序,可以很容易地执行正则表达式搜索和跨换行符替换。 这是纯粹的脚本,从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
这里是一个批处理代码,它需要你的输入块被写入临时文件目录下的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命令直接解析活动目录查询的输出。