2013-02-06 31 views
0

我正在构建一个查询AD的批处理文件,将结果导入到.txt文件中,然后使用for/f循环来解析和规范.txt文件。我遇到了一些并发症,并希望有其他的眼睛看看它。利用cmd的“for/f”解析和规范化文件

此外,使用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

如果你使用'在(%FN%)的',而不是会发生什么'在( '更加%FN%')'?请注意,如果%fn%可能包含空格,那么您需要使用usebackq选项和'in(“%fn%”)''。 – Neil

+0

请注意,'%i'在批处理脚本中不起作用。你必须使用'%% i'。 –

回答

4

你的fn分配是不对的。这些空间显著。你创建了一个变量同样,你的报价也是不平衡的,这会导致后面的解析问题,分配发生在两个地方,一个正确的表格看起来像:

set "fn=%gn%List.txt" 

请注意,在变量名前使用带有引号的表格时,封闭引号不包含在该值中。

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

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

谢谢!这帮助我认清了剩下的问题。 – Justin

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