在批处理脚本中验证变量的字符长度

问题描述 投票:0回答:1

我正在检查变量字符串值(采用此格式

YYYYMMDD
的总长度是否为八个字符。然而,即使我恰好输入 8,它也会出错。

rem Get date for the new filenames
:enter_date_videos
set /p "date=Enter the date (YYYYMMDD) for the new filenames: "
if "!date!"=="exit" goto :EOF
if NOT "!date:~0,8!"=="!date!" or NOT "!date:~8!"=="" (
    echo Error: The date needs to be exactly 8 characters in the format YYYYMMDD.
    goto enter_date_videos
)

我尝试执行

!date:~0,8!
,以便检查它是否比
8
短,并用
!date:~8!
检查它是否等于
8
,但仍然没有运气。

batch-file
1个回答
0
投票

我建议使用:

rem Get date for the new file names.
:enter_date_videos
set /P "FileNameDate=Enter the date (YYYYMMDD) for the new file names: " || goto enter_date_videos
setlocal EnableDelayedExpansion & echo(!FileNameDate!| %SystemRoot%\System32\findstr.exe /R /X "[12][0123456789][0123456789][0123456789][01][0123456789][0123][0123456789]" 1>nul & endlocal
if errorlevel 1 goto enter_date_videos

命令提示符
中运行 set /? 并阅读整个输出帮助。有一个 dynamic 变量
DATE
,它永远不会因为 environment 变量
DATE
的定义而变得不可访问。有关 dynamicenvironment 变量的更多信息,请参阅 CMD 中动态环境变量与普通环境变量之间的区别

接下来阅读:如何阻止 Windows 命令解释器在用户输入不正确时退出批处理文件执行?

|| goto enter_date_videos
所在行的代码
set /P
会导致用户在不输入任何内容时立即再次提示。

还应该阅读 DosTips 论坛主题 ECHO。无法给出文本或空行 - 而是使用 ECHO/,因为解释了

(
的用法,而不是
echo
!FileNameDate!
之间的空格来输出用户输入字符串并重定向到 FINDSTR

!FileNameDate!
|
之后不要有空格字符,这一点很重要,因为该空格也会由 ECHO 输出。该尾随空格将导致正则表达式查找永远不会匹配具有恰好八个字符的数字字符串,其中世纪的第一位数字是
1
2
,月份的第一位数字是
0
1
和第一位数字月份中的第几天是
0
1
2
3
,所有其他数字均在
0
9
范围内。当然,通过简单的正则表达式日期字符串验证仍然可能存在无效日期。不要使用
[0-9]
,因为 FINDSTR 在这种情况下也会接受
¹²³
作为有效数字,这在这里绝对不需要。

使用Windows批处理文件的单行多个命令解释了第四行使用的无条件命令运算符

&
,用于临时启用延迟变量扩展,这在这里也很重要。有关原因,请参阅:如何阻止 Windows 命令解释器在用户输入不正确时退出批处理文件执行?

阅读此答案,了解有关命令 SETLOCALENDLOCAL 的详细信息。

为什么在 FINDSTRthen 使用 if errorlevel 1 检查 FINDSTR 的退出代码之后始终运行

ENDLOCAL
是可以的,解释如下:

© www.soinside.com 2019 - 2024. All rights reserved.