Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理中由减号分隔的最后一个标记_Windows_Batch File_For Loop - Fatal编程技术网

Windows 批处理中由减号分隔的最后一个标记

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):

我有一个字符串“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
):


(%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%