在批处理文件中,如何在变量中获取最后一个标记,无论它是数字还是单词,而不管变量中有多少个标记/单词。
我将把一个参数传递给批处理文件,如下所示:
C:\execbatch.bat "This is example one"
要么
C:\execbatch.bat "This is example number 2"
然后批处理文件将是这样的:
@echo off
SET var=%1
SET last=some command to grab the last token of %var%
echo %last%
exit
基本上,我需要能够始终抓住最后一个令牌,在这些示例中,我希望从示例1中抓取one
,从示例2抓取2
。
其他信息:
这不是命令行参数,这只是一个简化的例子:
案例是我在批处理文件中调用命令并将其输出发送到如下变量:
C:\execbatch.bat memory
或C:\execbatch.bat cpu
然后在批处理文件中:
For /F "Tokens=*" %%I in ('c:\monitor.exe -C custom_performance_counter -t %1 -w 80 -c 90') Do Set COMMANDOUTPUT=%%I
Echo %COMMANDOUTPUT%
Set CURRENTVALUE=some command to grab the last token of %COMMANDOUTPUT%
Echo "The current value is %CURRENTVALUE%"
这将根据检查类型输出各种结果;但是在每种情况下,最后一个令牌/变量始终是当前值,尽管是数字或单词。
答案 0 :(得分:6)
为什么这么复杂?
set var1=This is a String
for %%A in (%var1%) do set last=%%A
set xcmd=c:\monitor.exe -C custom_performance_counter -t %1 -w 80 -c 90
for /f "tokens=*" %%I in ('%xcmd%') do for %%A in (%%~I) do set last=%%A
echo last=%last%
答案 1 :(得分:5)
@echo off
set var1=This is a String
set var2=%var1%
set i=0
:loopprocess
for /F "tokens=1*" %%A in ( "%var1%" ) do (
set /A i+=1
set var1=%%B
goto loopprocess )
echo The string contains %i% tokens.
for /F "tokens=%i%" %%G in ( "%var2%" ) do set last=%%G
echo %last%
pause
答案 2 :(得分:1)
如果你坚持只传递一个参数,那么你可以使用子程序:
@echo off
call :get_last %~1
echo.%last%
goto :eof
rem get_last tokens...
:get_last
set last=%1
shift
if [%1]==[] goto :eof
goto get_last
但是,如果您只是将任意数量的参数传递给批处理,那么您可以直接执行此操作:
@echo off
:l
set last=%1
shift
if [%1]==[] goto pl
goto l
:pl
echo %last%
附注:您很少想将exit
放在批处理文件中,因为它退出命令处理器,而不是批处理。如果直接从shell或其他批处理文件中使用它,那有点烦人。
答案 3 :(得分:0)
有些代码在Eli的答案上打了个高手。
@echo off
set var1=This is a String
REM token_string will be manipulated each loop
set token_string=%var1%
:find_last_loop
for /F "tokens=1*" %%A in ( "%token_string%" ) do (
set last=%%A
set token_string=%%B
goto find_last_loop)
echo %last%
pause
找到':'分隔符的东西......
for /F "tokens=1* delims=:" %%A in ( "%token_string%" ) do (
答案 4 :(得分:0)
如果标记用空格分隔,则最后一个标记是:
set b=command to grab the last token
for %i in (%b: =\%) do echo %~ni