Windows 批处理中由减号分隔的最后一个标记
我有一个字符串“xx yy zz” 我需要得到最后一个负号后面的部分 通常,我是这样做的Windows 批处理中由减号分隔的最后一个标记,windows,batch-file,for-loop,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” 有人能帮忙吗?用一个普通的表示(不带/f):
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”
有人能帮忙吗?用一个普通的
表示(不带/f
):
(%string:-=%
用空格替换每个-
,因此for
可以将字符串拆分为令牌,并将每个令牌分配给(相同)变量,导致变量保存最后一个标记。选项字符串tokens=1-4
将允许for/F
循环将最后一个字符串部分aa
分配给变量引用%%l
,如果它存在;%%l
否则将为空。因此您可以执行if
查询以检查清空并在case中使用%%k
,以此类推,如下所示:
for/F“tokens=1-4 delims=-”%%i in(“xx-yy-zz-aa”)do(
设置“用户\国家=%%l”
如果未定义用户\u国家/地区,则设置“用户\u国家/地区=%%k”
如果未定义用户\u国家设置“用户\u国家=%%j”
)
echo/%用户\国家/地区%
另一种方法是:
set“STRING=xx yy zz aa”
设置“DUMMY=%STRING:-=”&设置“USER\u COUNTRY=%”
echo/%用户\国家/地区%
如果输入字符串包含“
字符,这种方法可能会失败。一种解决方案是转换字符串,用反斜杠替换破折号,使其“看起来”是一条路径,可以用for
命令处理
@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“字符串=xxx yyy zzz”
对于/f“delims=“%”中的%%a(“::%string:-=\%”),请设置“last=%%~nxa”
回显%last%
另一个例子:
@Echo关闭
Set/P“InString=输入分隔字符串:”
回音=
如果“%InString%”==“转到:EOF
Set/P“Delimiter=输入分隔符:”
回音=
如果“%Delimiter%”==“GoTo:EOF
设置“Delimiter=%Delimiter:~,1%”
:循环
如果定义了InString(
对于/F“EOL=%Delimiter%Tokens=1*Delims=%Delimiter%”%%A In(“%InString%”)
)Do(设置“LastToken=%%A”和设置“InString=%%B”)&转到循环
)否则设置LastToken
超时-1
退出/B
此版本仍会有一些字符的问题tokens=1-4
如果aa
存在,则会将最后一部分分配给%%l
;您可以执行if
查询以检查它是否为空;这样:for/F“tokens=1-4 delims=-”%i in(“xx yy zz aa”)do(设置“USER\u COUNTRY=%l“&如果未定义用户\国家/地区集”用户\国家/地区=%%k“&如果未定义用户\国家/地区集”用户\国家/地区=%%j”)
即将发布完全相同的自扩展代码变体,这时我意识到我太晚了。顺便说一句,这里不需要延迟扩展。这很好,+1!显然,如果输入字符串包含\
或/
…@aschipfl,那么它可能会失败。是的,如果字符串中的最后一个元素(以前的值不冲突)可能包含斜杠或反斜杠如果字符串以点或空格结尾也会出现问题。如果字符串已包含等号、空格、逗号或分号(或制表符或/0xFF,但可能性很小),则该操作也会失败考虑到预期结果命名为User\u Country
和两个字母标记,这些字符都不可能出现。使用%string:-=“”%”
和%%~a
可以避免与上述标记分隔符@dbenham相关的问题。。。
set string=xxx-yyy-zzz
for %%a in (%string:-= %) do set last=%%a
echo %last%