从Batch中的变量中获取最后2个令牌

时间:2017-10-25 22:32:09

标签: batch-file cmd

我需要在批处理

中获取来自变量的最后2个令牌

变量是

Rastreando a rota para user722-PC [192.168.1.106]

我需要的输出是一个包含

的变量
user722-PC

和另一个包含

[192.168.1.106]

不,我不能使用

for /f "tokens=5,6 delims= " %%a in ("%variable%") do set host=%%a & set ip=%%b
echo %ip% %host%

因为在这种情况下我指定了令牌5,6,我想要的是动态获取最后2个令牌,所以我不能指定任何令牌号码mannualy

//这样我只能获得最后一个标记,考虑到分隔符是一个空格,并且分隔符不能更改

FOR %%a in (%variable%) do set lastPart=%%a
ECHO %lastPart%

2 个答案:

答案 0 :(得分:3)

@echo off
setlocal EnableDelayedExpansion

set "var=Rastreando a rota para user722-PC [192.168.1.106]"
set "last=%var: =" & set "lastBut1=!last!" & set "last=%"
SET last

提示:使用@echo on

运行此程序

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL
SET "variable=Rastreando a rota para user722-PC [192.168.1.106]"
FOR %%a IN (%variable%) DO CALL SET "lastbut1=%%lastpart%%"&SET "lastpart=%%a"
SET last

GOTO :EOF

call set重新解析它,所以set "lastbut1=%lastpart%"在子shell中执行。

这也可以使用delayedexpansion来完成,其中有很多关于SO的文章。

其工作原理的简短说明是 *** MAGIC ***

更长的解释是:

命令CALL SET "lastbut1=%%lastpart%%"SET "lastpart=%%a"%variable%中的每个元素的顺序执行,这是一个简单的字符串,其元素由空格,制表符,逗号或分号分隔。

& 用于分隔命令,仅用于允许在同一物理线路上指定许多命令。代码也可以写成

(
 CALL SET "lastbut1=%%lastpart%%"
 SET "lastpart=%%a"
)

完全一样;括号是必需的并且包含各个命令。这里还有一个额外的语法要求。开场(必须与do在同一物理线路上。

CALL SET "lastbut1=%%lastpart%%"在子shell中执行SET "lastbut1=%lastpart%",将lastbut1设置为lastpart当前值。然后SET "lastpart=%%a"lastpart设置为%%a中的值。

因此,在下一次迭代中,lastbut1获取在前一次迭代中应用于lastpart的值,依此类推,直到最后一次,lastpat获取非常列表中的最后一项,lastbut1刚刚被赋予了之前的值。

因此,要获得lastbut2,您需要的只是使用

FOR %%a IN (%variable%) DO call set "lastbut2=%%lastbut1%%&CALL SET "lastbut1=%%lastpart%%"&SET "lastpart=%%a"

lastbut2中设置lastbut1,从lastbut1设置lastpart,从lastpart设置%%a。{/ p>