【问题标题】:Differenciate between numbers and letters (Batch)区分数字和字母(批量)
【发布时间】:2013-06-04 16:36:55
【问题描述】:

我正在寻找一种在使用批处理脚本读取 Windows 7 中的用户帐户名称时区分字母和数字的方法。比如我要区分UserUser1234。目的是因为我正在使用帐户删除脚本来删除旧帐户,但我只想删除那些带有数字的帐户。

我已经研究了一段时间,但我能找到的最接近的东西在这里:http://www.dostips.com/?t=Experimental.StringDiff

也许,另一个选择是能够读取用户名的最后 4 个,如果它们等于 1-9,则将它们添加到删除组。但是,我不确定如何执行此操作,因此 - 再次 - 感谢任何帮助。

谢谢

【问题讨论】:

    标签: batch-file


    【解决方案1】:
    @echo off
    setlocal EnableDelayedExpansion
    
    set user=User1234
    
    set digitsInUser=
    for /L %%i in (0,1,9) do (
        if "!user:%%i=!" neq "%user%" set digitsInUser=1
    )
    
    if defined digitsInUser (
        echo The user "%user%" have digits
    )
    

    【讨论】:

    • 这只会在数字位于username1234 的后沿时执行,这可能是问题中的情况。这是一个巧妙的解决方案,不会影响像 june.2.smith 这样的用户名
    【解决方案2】:

    这是另一种选择。

    @echo off
    for /f "delims=" %%a in (user.txt) do (
     for /f "delims=0123456789" %%b in ("text-%%a") do (
       if not "text-%%a"=="%%b" (
          echo execute your routine here "%%a" has numbers
      )
     )
    )
    

    【讨论】:

    • 我将此标记为答案。它很棒,而且很短。我想我会用这个。非常感谢您的帮助!
    • 很高兴它有帮助。请注意(实际上)如果用户名是所有数字,则例程将不会针对该用户名执行。我已经在上面的编辑中解决了这个问题。
    • 我们没有全是数字的用户名,所以应该没问题。
    • 所以在我最初的测试中,这很好用。但是,我需要在其上使用完整脚本的计算机将有几个用户名,其中的数字需要被根除。我在这个脚本中发现的是,它将删除其中一个带有数字的帐户,但不是全部。我认为问题可能更多出在我身上(他们对脚本不是很精通),而不是脚本本身。但是,任何见解肯定都会受到赞赏。
    • user.txt 中有什么内容?应该处理哪一行被忽略?正如您所说,也许这是您实现脚本的方式...
    【解决方案3】:

    Windows shell 正则表达式功能

    @echo off&setlocal
    rem some testing
    for %%i in (
        "User1234"
        "AAA111"
        "AAA"
        "111"
        "aaa"
        "a"
        "1"
        "me & you"
        "1 + 1"
        ""
        ) do (
      call:differentiate "%%~i"
      )
    goto:eof
    
    :differentiate "string"
    set "String=%~1"
    setlocal enabledelayedexpansion
    echo("!string!"|findstr "^.[0-9][0-9]*.$" >nul&& echo "!string!": only numbers || echo "!string!": NOT all numbers
    echo("!string!"|findstr "^.[a-z][a-z]*.$" >nul&& echo "!string!": only letters || echo "!string!": NOT all letters
    echo(
    endlocal
    goto:eof
    

    .. 输出是:

    “User1234”:并非所有数字 “User1234”:并非所有字母 “AAA111”:并非所有数字 “AAA111”:不是所有字母 “AAA”:并非所有数字 “AAA”:只有字母 “111”:只有数字 “111”:不是所有字母 “aaa”:不是所有数字 “aaa”:只有字母 “a”:不是所有数字 “a”:只有字母 “1”:只有数字 “1”:不是所有字母 “我和你”:不是所有的数字 “我和你”:不是所有的字母 “1 + 1”:不是所有数字 “1 + 1”:不是所有字母 "": 不是所有的数字 “”:不是所有的字母

    【讨论】:

    • +1 哇,正则表达式成批!!!我认为它们只能用于“真正的”脚本语言...... ;-) 你怎么看:这个解决方案是“可怕的”还是“微不足道的”?
    • 是的,我可以看到这个。真可惜:((
    • 顺便说一句,你看到我在this question的评论了吗?
    • 你摇滚!非常感谢 - 也感谢所有回答的人!我将此标记为答案。
    • @Aacini -- 是的,你是对的!我也从其他论坛知道这一点。这始终只属于批次并且没有一个评论家有一点扎实的知识。 “拿 Powershell,安装 Cygwin,为什么不安装 Java……”人们相信,他们一定讨厌微软,而批处理是它在地球上的代表。
    【解决方案4】:

    你想要的是一个正则表达式。您可能会考虑使用 PowerShell 或 perl 重写您的脚本,如果您可以安装它的话。与坚持使用批处理文件相比,任何一个都是主要的初始学习曲线,但随着时间的推移,它会得到丰厚的回报。批处理文件中的许多可怕任务在像其中任何一种这样的“真实”脚本语言中都是微不足道的。

    【讨论】:

    • Windows 命令外壳脚本语言 (WCSSL) 具有区分数字和字母的正则表达式功能。你的回答既粗鲁又愚蠢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多