我正在构建一个查询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%')
感谢。
答案 0 :(得分:4)
您对fn
的分配是错误的。空间很重要。您正在创建名称中带有空格的变量。此外,您的报价是不平衡的,这将导致以后解析问题。分配发生在两个地方。正确的形式如下:
set "fn=%gn%List.txt"
请注意,在变量名称前面使用此表单时,引号不包含在值中。
在批处理文件中运行时,必须将FOR / F语句中的百分比加倍。此外,由于我删除了引号,您应该将它们添加到MORE目标中。最后,由于您在脚本顶部关闭了ECHO,因此不需要@。
for /f "delims=, tokens=1,2" %%i in ('more "%fn%"') do echo %%i
答案 1 :(得分: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