0

我正在构建一个查询 AD 的批处理文件,将结果通过管道传输到 .txt 文件中,然后使用 for /f 循环来解析和规范化 .txt 文件。我遇到了一些并发症,想让其他眼睛看看它。

另外,使用 VBS 来解析/规范化而不是笨拙的 /f 会更好吗?

批:

@echo off
echo **********************************************
echo * This batch file will query members of a DL *
echo **********************************************
echo.   
set /p gn=Enter DL to get Members:

echo. 
CHOICE /C:12 /M "Choose 1 for DOMAIN1 query, Choose 2 for DOMAIN2 query."
IF ERRORLEVEL 2 GOTO Label2
IF ERRORLEVEL 1 GOTO Label1 

:Label1
dsquery group DC=DOMAIN1,DC=NET -name "%gn%" | dsget group -members -expand >> "%gn%"List.txt
set fn = "%gn%"List.txt"
GOTO End

:Label2
dsquery group DC=DOMAIN2,DC=NET -name "%gn%" | dsget group -members -expand >> "%gn%"List.txt
set fn = "%gn%"List.txt"
GOTO End

:End

for /f "delims=, tokens=1,2" %i in ('more %fn%') do @ echo %i

以下是创建的 .txt 文件中的一些示例行:

"CN=LastName1\, FirstName1,OU=OU1,OU=OUSUB1,DC=DOMAIN1,DC=net"
"CN=LongLastName1\, LongFirstName1,OU=OU1,OU=OUSUB1,DC=DOMAIN1,DC=net"
"CN=LastName2, FirstName2,OU=OU1,OU=OUSUB1,DC=DOMAIN1,DC=net"

在 for 循环中,我用逗号分隔。从我的示例行中,我打算将令牌 1 存储为“CN=LastName1\ 并将令牌 2 存储为 FirstName1 并从那里开始,但这就是我被卡住的地方。我的 for 循环出错了”“此时 fni 是意外的” . 这与从单引号中转义 %fn% 变量有关吗

('more %fn%') 

谢谢。

4

2 回答 2

4

你的分配fn是错误的。空间很重要。您正在创建一个名称中带有空格的变量。此外,您的报价是不平衡的,这会导致以后的解析问题。分配发生在两个地方。正确的形式如下所示:

set "fn=%gn%List.txt"

请注意,当在变量名前使用引号时,值中不包含封闭引号。

在批处理文件中运行时,您必须将 FOR /F 语句中的百分比加倍。此外,由于我删除了引号,您应该将它们添加到您的 MORE 目标中。最后,不需要@,因为您在脚本顶部关闭了 ECHO。

for /f "delims=, tokens=1,2" %%i in ('more "%fn%"') do echo %%i
于 2013-02-06T20:35:46.787 回答
0

工作解决方案(进行一些重构):

set /p gn=Enter DL to get Members:

IF EXIST "%gn%"-List.txt (
     DEL "%gn%"-List.txt
)

echo. 
CHOICE /C:12 /M "Type 1 to query DOMAIN1. Type 2 to query DOMAIN2."
IF ERRORLEVEL 2 GOTO Label2
IF ERRORLEVEL 1 GOTO Label1 


:Label1
dsquery group DC=DOMAIN1,DC=NET -name "%gn%" | dsget group -members -expand >>
"%gn%".txt
GOTO End

:Label2
dsquery group DC=DOMAIN2,DC=NET -name "%gn%" | dsget group -members -expand >>
"%gn%".txt
GOTO End

:End
REM Cleaning up the output -
SET "fn=%gn%.txt"
FOR /f "delims=, tokens=1,2" %%i in ('type "%fn%"') do ( 
     FOR /f "delims==\, tokens=1,2" %%b in ("%%i%%j") do (echo %%c,%%j) >>
"%gn%"-List.txt)

REM Deleting the Temp file -
DEL "%gn%".txt
echo.
echo %gn%-List.txt created!
PING 1.1.1.1 -n 4 >NUL
于 2013-02-07T20:38:12.340 回答