我有一个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
这个版本仍然有一些字符的问题