批量分隔的批次中的最后一个标记

时间:2017-08-09 08:56:43

标签: windows batch-file for-loop

我有一个字符串" xx-yy-zz"

我需要在最后一个减号后获得该部分。

通常,我这样做

FOR /F "tokens=1-3 delims=-" %%i IN ("xx-yy-zz") DO SET USER_COUNTRY=%%k
echo Country: %USER_COUNTRY%   

但是现在我没有固定长度的字符串(可能有2/3/4分隔符)

如何指定我想要最后一张?所以我的代码适用于" xx-yy-zz"以及" xx-yy-zz-aa"

有人可以帮帮忙吗?

4 个答案:

答案 0 :(得分:7)

使用普通for(不含/f):

set string=xxx-yyy-zzz
for %%a in (%string:-= %) do set last=%%a
echo %last%

(%string:-= %用空格替换每个-,因此for可以将字符串拆分为标记并将它们中的每一个分配给(相同的)变量,从而导致变量保持最后一个标记。

答案 1 :(得分:3)

选项字符串tokens=1-4会让for /F循环将最后一个字符串部分aa分配给变量引用%%l(如果存在);否则%%l将为空。因此,您可以执行if查询以检查是否为空,并使用%%k代替,以此类推,依此类推:

for /F "tokens=1-4 delims=-" %%i in ("xx-yy-zz-aa") do (
    set "USER_COUNTRY=%%l"
    if not defined USER_COUNTRY set "USER_COUNTRY=%%k"
    if not defined USER_COUNTRY set "USER_COUNTRY=%%j"
)
echo/%USER_COUNTRY%

另一种方法是:

set "STRING=xx-yy-zz-aa"
set "DUMMY=%STRING:-=" & set "USER_COUNTRY=%"
echo/%USER_COUNTRY%

如果输入字符串包含"个字符,则此方法可能会失败。

答案 2 :(得分:2)

一种解决方案可能是转换字符串,用反斜杠替换破折号,以便"似乎" 可以使用for命令处理的路径

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "string=xxx-yyy-zzz"
    for /f "delims=" %%a in ("::%string:-=\%") do set "last=%%~nxa"

    echo %last%

答案 3 :(得分:2)

另一个例子:

@Echo Off
Set/P "InString=Enter your delimited string: "
Echo=
If "%InString%"=="" GoTo :EOF
Set/P "Delimiter=Enter the delimiter: "
Echo=
If "%Delimiter%"=="" GoTo :EOF
Set "Delimiter=%Delimiter:~,1%"
:Loop
If Defined InString (
    For /F "EOL=%Delimiter% Tokens=1* Delims=%Delimiter%" %%A In ("%InString%"
    ) Do (Set "LastToken=%%A" & Set "InString=%%B") & GoTo Loop
) Else Set LastToken
Timeout -1
Exit/B

此版本仍会出现一些字符问题