如何批量获取字符串末尾的数字?

How do I get the number at the end of a string in batch?

我正在编写一个使用本地机器主机名的批处理命令文件,我需要提取字符串末尾的数字。如何批量获取字符串末尾的数字?

输入:

W2008R2T001
W2008R2T002
W2008R2T003
W8_1_901
QATEST84
QATEST85
QATEST86

期望的输出:

001
002
003
901
84
85
86

这是我自己写的一个小批处理脚本。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "HostName=W2008R2T001"
set /p "HostName=Enter a host name (default %HostName%): "
call :GetNumber "%HostName%"
if "%Number%" == "" (
    echo This host name has no number at end.
) else (
    echo Found number at end of host name is: %Number%
)
pause
endlocal
goto :EOF

:GetNumber
set "Number="
set "StringToParse=%~1"
set "Digits=0123456789"
:CheckLastChar
if "!Digits:%StringToParse:~-1%=!" EQU "%Digits%" goto:EOF
set "Number=%StringToParse:~-1%%Number%"
set "StringToParse=%StringToParse:~0,-1%"
if "%StringToParse%" NEQ "" goto CheckLastChar
goto :EOF

这个批处理文件让用户输入一个字符串。对于这个字符串,调用子例程 GetNumber 使用在主批处理例程开始时启用的延迟环境变量扩展来复制字符串末尾的所有数字,以正确的顺序解析到环境变量 Number.

主例程评估环境变量的值 Number 并继续进行相应的处理。

有关其工作原理的详细信息,请打开命令提示符 window,在其中执行以下命令,并阅读每个命令的所有帮助页面输出。

  • call /?
  • goto /?
  • if /?
  • set /?

我发现你要的数据是最后一个用某个分隔符分隔的数据。在您的示例中,分隔符是 T_ 并且 W8_1_901 行中最多有 3 个部分。下面的批处理文件根据这些规则获取您想要的数据:

@echo off
setlocal EnableDelayedExpansion

for /F "tokens=1-3 delims=T_" %%a in (test.txt) do (
   for %%A in (%%a %%b %%c) do set "last=%%A"
   echo !last!
)

如果可能有更多分隔符,请将它们插入 delims=T_ 部分。如果一行中可能有更多的部分,修改tokens=1-3部分的“3”,在%%a %%b %%c部分增加更多的字母。