For loop 确定令牌数-批处理

For loop 确定令牌数-批处理,for-loop,batch-file,token,For Loop,Batch File,Token,我目前正在通过PowerShell和Batch编写大量用户创建脚本。目前这个脚本有95行,是我写过的最大的一个脚本 我希望脚本尽可能自动化,并计划将其提供给需要帮助创建大量用户的客户端。为此,我有一个21行的设置文件,其中一个变量是完整的域名(这是dsadd所需要的) 问题是用户可能有任意数量的变量,从测试实验室的两个变量到学校等地的四个变量。到目前为止,我能够分离代币,但我需要将它们全部存储为变量,如%%a、%%b,而不是将所有内容存储为%%a。令牌的数量将是动态的,因此我需要某种解决方案。类

我目前正在通过PowerShell和Batch编写大量用户创建脚本。目前这个脚本有95行,是我写过的最大的一个脚本

我希望脚本尽可能自动化,并计划将其提供给需要帮助创建大量用户的客户端。为此,我有一个21行的设置文件,其中一个变量是完整的域名(这是dsadd所需要的)

问题是用户可能有任意数量的变量,从测试实验室的两个变量到学校等地的四个变量。到目前为止,我能够分离代币,但我需要将它们全部存储为变量,如%%a、%%b,而不是将所有内容存储为%%a。令牌的数量将是动态的,因此我需要某种解决方案。类似这样的内容(是的,我知道这不是正确的语法):

在该行中,%%a和%%b是从用户列表excel文件读取的代码后面的另一个for循环中的变量。从两个代币到四个代币,我都需要这样的东西。我不介意这个问题的解决方案是否不是纯粹的批处理,但这是我的首选

谢谢

编辑:这是我目前使用的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行是这样的:

域名后缀(.SUFFIX.SUFFIX.SUFFIX) 现实生活中的一个例子是: 本地测试实验室 或 testlab.ghamilton.local

对于testlab,设置应仅为域名和后缀,尽管对于学校或机构等其他机构,域名后缀的数量最多可以达到四个。我想解释一下


编辑:很抱歉,已正确缩进代码。

如果我理解正确,您有一个字符串,如
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=
。有关更多详细信息,请参阅

要在环境变量中进行字符串替换,首先需要将值放在环境变量中。下面是一个脚本,它将结合上述技术从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
),然后按照上面的方法进行字符串替换(但是使用
而不是
%%
,以利用延迟扩展)

当然,您可以执行以下操作,而不是
回显

dsadd "cn=%cn%,ou=%ou%,dc=!domain:.=,dc=!"
for /l %%i in (4,-1,1) do if not defined token%%i set amount=%%i

下面是我的一个小片段,演示如何获取单独的令牌(delims是space和tab,但您可以更改它们)

test.txt
包含:

first second third
结果是:

token1=first
token2=second
token3=fourth
full=firstsecondthird
所以,你可以通过以下方式判断有多少代币

dsadd "cn=%cn%,ou=%ou%,dc=!domain:.=,dc=!"
for /l %%i in (4,-1,1) do if not defined token%%i set amount=%%i
或者类似的东西


希望这能有所帮助。

如果我很笨,我很抱歉,但我正试图弄明白这一点,我不明白你在问什么!你能告诉我吗。正确设置代码格式(每个代码行至少缩进四个空格,以便将其设置为代码格式)和2。在settings.ini文件中提供相关行的示例,以及3。您希望从这些采样线得到的结果。例如,您是否只想以标题所示的数字作为结尾?还是你想要一个“向量”?仅%%a、%%b等有什么问题?我不确定如何正确格式化代码,抱歉。我将在原始帖子中包括1和2。至于第三个,我希望脚本能够找到设置文件中特定行中的令牌数,然后根据令牌数通过dsadd添加用户。如果有三个令牌,这将像三个dc部分,如果有四个令牌,则像四个dc部分。我想将各种域后缀存储为变量,因为在这之后还有其他for循环,所以%%a等将不起作用。我刚刚了解了如何格式化代码。很抱歉以前没有这么做。此外,我不明白为什么这值得投否决票:/否决票是为了“它不清楚”,我留下一条信息解释什么是不清楚的。一旦你把它修好了,我就撤销否决票(或者其他人来投票)。好的,对不起。如果事情看起来不清楚,我很抱歉,我的大脑今天工作不太好,我有点感冒。谢谢你,内特。那么,如果我将域存储为从设置文件中读取的变量,这会起作用吗?Nate,我想知道您是否可以帮我做些其他事情。我有一些用户组,我需要向这些用户添加广告,但是我希望在设置文件中定义这些用户组。它们之间用逗号分隔,我想知道您是否可以做一些类似于您为域所做的事情。我想将它们添加到使用网络组的组中。抱歉,我应该在编写之前等待一段时间。我现在已经做了。谢谢你的帮助。