我目前正在通过PowerShell和Batch处理大规模用户创建脚本。目前脚本是95行,是我曾经批量编写的最大脚本。
我希望脚本尽可能自动化,并计划将其提供给需要帮助创建大量用户的客户。为此,我有一个21行设置文件,其中一个变量我需要的是完整的域名(这是dsadd需要的)
这个问题是用户可能有任意数量的变量 - 从testlabs中的两个到学校等地的四个变量。我到目前为止能够分离令牌,但我需要将它们全部存储为%% a,%% b之类的变量,而不是将所有内容存储为%% a。令牌的数量将是动态的,因此我需要某种解决方案。这样的事情(是的,我知道这不是正确的语法):
if number of tokens=4 (
dsadd "cn=%%a,ou=%%b,dc=%DSuffix1%,dc=%DSuffix2%,dc=%DSuffix3%,dc=%Dsuffix4% )
在该行中,%% a和%% b是稍后在从用户列表excel文件中读取的代码中的另一个for循环中的变量。从两个令牌到四个令牌,我需要类似的东西。我不介意解决这个问题的方法不是纯粹的BATCH,但这是我的首选方案。
感谢。
编辑:这是我目前的for循环,它嵌套在另一个更大的for循环中,用于添加用户:
for /f "tokens=1,2,3,4 delims=." %%a in (Settings.ini) do (
set L=22
if !L!=22 set DSuffix1=%%a&& set DSuffix2=%%b&& set DSuffix3=%%c&& set DSuffix4=%%d
)
settings.ini文件包含各种设置,例如Exchange服务器和用户主目录的路径。我需要解释的第22行是这样的:
DOMAINNAME.SUFFIX(.SUFFIX.SUFFIX.SUFFIX) 一个真实的例子是: testlab.local 要么 testlab.ghamilton.local
对于testlab,设置应该只是域名和后缀,但对于其他学校或机构,域名后缀的数量最多可以为4。我想解释一下。
编辑:管理正确缩进代码,抱歉。
答案 0 :(得分:1)
如果我理解正确,您就会有domain.foo.bar.baz
之类的字符串,并希望将其更改为dc=domain,dc=foo,dc=bar,dc=baz
。
这个怎么样?
set domain=domain.foo.bar.baz
echo dc=%domain:.=,dc=%
那应该回应一下:
dc=domain,dc=foo,dc=bar,dc=baz
%domain:.=,dc=%
行正在扩展%domain%
环境变量,但将所有.
替换为,dc=
。有关详细信息,请参阅http://ss64.com/nt/syntax-replace.html。
要在环境变量中进行字符串替换,首先需要将值放在环境变量中。这是一个脚本,它将从settings.ini中读取第22行,并结合上述技术:
setlocal enabledelayedexpansion
set L=0
for /f %%a in (settings.ini) do (
set /a L=!L! + 1
if !L! equ 22 (
set domain=%%a
echo dc=!domain:.=,dc=!
)
)
L
用于计算我们所依赖的行。当我们到达第22行时,我们将环境变量设置为整行(%%a
)的值,然后执行上面的字符串替换(但使用!
而不是%
延迟扩张的优势)。
当然不是echo
,而是
dsadd "cn=%cn%,ou=%ou%,dc=!domain:.=,dc=!"
答案 1 :(得分:0)
这是我的小片段,用于演示如何获取单独的标记(delims是空格和制表符,但您可以更改它们)。
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1,2,3,4" %%a in (test.txt) do (
set token1=%%a
set token2=%%b
set token3=%%c
set token4=%%d
set full=%%a%%b%%c%%d
)
set token
set full
pause>nul
test.txt
包含:
first second third
输出结果为:
token1=first
token2=second
token3=fourth
full=firstsecondthird
所以,你可以用
之类的东西判断出有多少令牌for /l %%i in (4,-1,1) do if not defined token%%i set amount=%%i
或类似的东西。
希望有所帮助。