批处理中的最后一个令牌由减号分隔

我有一个string“xx-yy-zz”

我需要在最后一个减号字符之后得到零件。

通常,我这样做

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

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

我如何指定我想要最后一个? 所以我的代码可以用于“xx-yy-zz”以及“xx-yy-zz-aa”

有人可以帮忙吗?

使用plain( for /f不):

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

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

选项字符串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% 

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

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

 @echo off setlocal enableextensions disabledelayedexpansion set "string=xxx-yyy-zzz" for /f "delims=" %%a in ("::%string:-=\%") do set "last=%%~nxa" echo %last% 

另一个例子:

 @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 

这个版本仍然有一些字符的问题