【问题标题】:Determine Number of Tokens - BATCH确定令牌数量 - BATCH
【发布时间】:2013-03-09 00:26:51
【问题描述】:

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

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

这样做的问题是,用户可能有任意数量的变量 - 从测试实验室中的两个到学校等地方的四个。到目前为止,我能够分离令牌,但是我需要将它们全部存储为变量,例如 %%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 行,如下所示:

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

对于测试实验室,设置只能是域名和后缀,但对于学校或机构等其他设置,域后缀的数量最多可以达到四个。我想解释一下。

编辑:设法正确缩进代码,对不起。

【问题讨论】:

  • 对不起,如果我很密集,但我试图理解这一点,我不明白你在问什么!您能否 1. 正确格式化您的代码(每个代码行至少缩进四个空格,以便将其格式化为代码)和 2. 在 settings.ini 文件中提供相关行的示例,以及 3. 您希望拥有什么作为这些样本行的结果。例如,您是否只想以标题所示的 number 结尾?或者你想要一个“向量”?仅 %%a、%%b 等有什么问题?
  • 我不确定如何正确格式化代码,抱歉。我将在原始帖子中包含 1 和 2。至于三,希望有让脚本在Settings文件的特定行中找到token数量,然后根据token数量通过dsadd添加用户。这就像三个 dc 部分,如果有三个令牌,四个如果有四个令牌等。我想将各种域后缀存储为变量,因为在这个之后我还有其他 for 循环,所以 %%a 等将不起作用。
  • 我刚刚弄清楚如何格式化代码。很抱歉以前没有这样做。另外,我不明白为什么应该投反对票:/
  • 反对票是“不清楚”,我留言解释不清楚的地方。一旦你修好它,我就会撤消反对票(或者其他人来支持)。
  • 好的,抱歉。如果事情看起来不清楚,我很抱歉,我今天的大脑不太好,我有点感冒。

标签: for-loop batch-file token


【解决方案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=!"

【讨论】:

  • 感谢内特。如果我将域存储为我从设置文件中读取的变量,那会起作用吗?
  • 内特我想知道你是否可以帮忙做点别的事情。我有用户组,我需要将用户添加到其中,但是我希望在设置文件中定义这些用户组。它们用逗号分隔,我想知道您是否可以做一些类似于您为域所做的事情。我想最好将它们添加到使用 net group 的组中。
  • 对不起,我应该等一会儿再写。我现在已经做到了。感谢您的所有帮助。
【解决方案2】:

这是我的小 sn-p,用于演示如何获取单独的标记(分隔符是空格和制表符,但您可以更改它们)。

@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

或者类似的东西。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多