Batch file 批处理文件:用户输入操作

Batch file 批处理文件:用户输入操作,batch-file,Batch File,我有一个批次需要一些信息,所以我决定使用命令set/p“var=”,但我想先做一些操作或限制 如果我想询问日期set/p“date=insert date,如2012/07/15=“”,我只想在以这种方式输入2012/07/15时接受答案 2.如果我想询问优惠券编号set/p“number=insert number=“”,我想在代码的第一个字符是Z然后number=number忽略Z时进行询问,例如,如果用户插入z12345 我想要NUMBER=12345,所以我执行了命令的这一半如果“%va

我有一个批次需要一些信息,所以我决定使用命令set/p“var=”,但我想先做一些操作或限制

  • 如果我想询问日期
    set/p“date=insert date,如2012/07/15=“
    ”,我只想在以这种方式输入2012/07/15时接受答案
  • 2.如果我想询问优惠券编号
    set/p“number=insert number=“
    ”,我想在代码的第一个字符是Z然后number=number忽略Z时进行询问,例如,如果用户插入z12345 我想要NUMBER=12345,所以我执行了命令的这一半
    如果“%var:~0,1%”==“z”,那么???
    所以我不知道怎么做剩下的


    我还注意到,如果我想执行第四个字符,那么如果“%var:~4,1%”==“g”,这将不起作用,为什么?

    您可以使用
    findstr/R
    用正则表达式检查输入

    差不多

    setlocal EnableDelayedExpansion
    set "myDate="
    set /p myDate=
    if defined myDate (
      echo !myDate! | findstr /R "^[0123456789][0123456789][0123456789][0123456789]/[0123456789][0123456789]/[0123456789][0123456789]" >nul && Echo ok || echo fail
    )
    

    您可以使用
    findstr/R
    使用正则表达式检查输入

    差不多

    setlocal EnableDelayedExpansion
    set "myDate="
    set /p myDate=
    if defined myDate (
      echo !myDate! | findstr /R "^[0123456789][0123456789][0123456789][0123456789]/[0123456789][0123456789]/[0123456789][0123456789]" >nul && Echo ok || echo fail
    )
    

    以下脚本显示了如何执行这两项任务:

        @setlocal enableextensions enabledelayedexpansion
        @echo off
    
        set /p "dt=Enter date as yyyy/mm/dd: "
        set rc=1
        echo x%dt%x| findstr /r "^x[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]x$" >nul: && set rc=0
        if %rc%==1 (
            echo Invalid date
            goto :endl
        )
        echo Date was %dt%
    
        set /p "num=Enter number as z99999 or 99999: "
        if %num:~0,1%==xz set num=!num:~1!
        echo Number was %num%
    
    :endl
        endlocal
    
    第一部分介绍如何使用
    findstr
    及其正则表达式功能来设置
    rc
    返回代码变量,然后可以检查该变量

    第二部分显示了如何从字符串中去掉第一个字符(如果它是
    z
    ),尽管您可能会发现
    findstr
    在那里也很有用,因此您可以检查整个字符串,例如:

        set /p "num=Enter number as z99999 or 99999: "
        if %num:~0,1%==xz set num=!num:~1!
        set rc=1
        echo x%num%x| findstr /r "^x[0-9][0-9][0-9][0-9][0-9]x$" >nul: && set rc=0
        if %rc%==1 (
            echo Invalid number
            goto :endl
        )
        echo Number was %num%
    

    以下脚本显示了如何执行这两项任务:

        @setlocal enableextensions enabledelayedexpansion
        @echo off
    
        set /p "dt=Enter date as yyyy/mm/dd: "
        set rc=1
        echo x%dt%x| findstr /r "^x[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]x$" >nul: && set rc=0
        if %rc%==1 (
            echo Invalid date
            goto :endl
        )
        echo Date was %dt%
    
        set /p "num=Enter number as z99999 or 99999: "
        if %num:~0,1%==xz set num=!num:~1!
        echo Number was %num%
    
    :endl
        endlocal
    
    第一部分介绍如何使用
    findstr
    及其正则表达式功能来设置
    rc
    返回代码变量,然后可以检查该变量

    第二部分显示了如何从字符串中去掉第一个字符(如果它是
    z
    ),尽管您可能会发现
    findstr
    在那里也很有用,因此您可以检查整个字符串,例如:

        set /p "num=Enter number as z99999 or 99999: "
        if %num:~0,1%==xz set num=!num:~1!
        set rc=1
        echo x%num%x| findstr /r "^x[0-9][0-9][0-9][0-9][0-9]x$" >nul: && set rc=0
        if %rc%==1 (
            echo Invalid number
            goto :endl
        )
        echo Number was %num%
    
    此外,还介绍了编写自己的“SET/p”例程的方法,因此您可以根据自己的具体需要对其进行修改。请注意,这不是读取字符串后的测试,而是在读取字符串时处于活动状态的交互式测试。您甚至可以限制用户完成输入的时间

    查找“3-GetKey.exe.hex”辅助程序,然后查找“Readline subroutine”

    我希望有帮助

    Antonio

    介绍了一种编写自己的“SET/p”例程的方法,因此您可以根据自己的具体需要对其进行修改。请注意,这不是读取字符串后的测试,而是在读取字符串时处于活动状态的交互式测试。您甚至可以限制用户完成输入的时间

    查找“3-GetKey.exe.hex”辅助程序,然后查找“Readline subroutine”

    我希望有帮助


    Antonio

    您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取日期格式的行;用户键入字符时,斜杠将自动插入:

    call :ReadFormattedLine myDate="####/##/##" /M "insert date like this 2012/07/15: "
    
    下面的命令读取由5位数字组成的数字;子例程不接受非数字字符:

    call :ReadFormattedLine NUMBER="#####" /M "insert number: "
    

    此子例程是以纯批处理方式编写的,因此不需要任何附加程序,并且允许执行多个格式化输入操作,如读取密码。您可以从下载。

    您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取日期格式的行;用户键入字符时,斜杠将自动插入:

    call :ReadFormattedLine myDate="####/##/##" /M "insert date like this 2012/07/15: "
    
    下面的命令读取由5位数字组成的数字;子例程不接受非数字字符:

    call :ReadFormattedLine NUMBER="#####" /M "insert number: "
    


    此子例程是以纯批处理方式编写的,因此不需要任何附加程序,并且允许执行多个格式化输入操作,如读取密码。您可以从下载。

    答案很好,但是我的第二个问题呢?顺便问一下,如果我想插入字母,我应该做[abc..to infinity]吗?不区分大小写呢?据我所知,如果定义了日期,则
    中的条件决不能为假,因为
    日期
    在Windows中决不能未定义。@Andrey M-说得好!在这里使用
    date
    asw变量名不好,我会更改it@Leo92-
    但是我的第二个问题呢?
    嗯,我给你指出了正确的方向,现在你应该能够自己解决这个问题了。很好的答案,但是我的第二个问题呢?顺便问一下,如果我想插入字母,我应该做[abc..to infinity]吗?不区分大小写呢?据我所知,如果定义了日期,则
    中的条件决不能为假,因为
    日期
    在Windows中决不能未定义。@Andrey M-说得好!在这里使用
    date
    asw变量名不好,我会更改it@Leo92-
    但是我的第二个问题呢?
    嗯,我告诉你正确的方向,现在你应该能够自己解决它注意,有一个系统环境变量叫做
    DATE
    ,除非被重写,计算为当前系统日期。在这种情况下,我应该如何使用它?您不一定需要使用它,因为我不确定脚本请求的日期。无论如何,系统的日期变量值除了用于显示当前日期外,对于其他用途很少有用。我可以详细解释一下原因,但我的观点是,如果您使用的名称已经被操作系统保留为其他名称,那么您可能会在使用此类变量时遇到一些“有趣”的行为。特别是,您不能真正取消定义这样一个变量,因为一旦您取消定义,系统就会用该变量要保存的值来定义它。好的,谢谢,非常有用的信息对不起,我想您已经在那里丢失了我。请注意,有一个名为
    D的系统环境变量