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
Batch file 批处理变量中的最后一个标记_Batch File - Fatal编程技术网

Batch file 批处理变量中的最后一个标记

Batch file 批处理变量中的最后一个标记,batch-file,Batch File,在批处理文件中,如何获取变量中的最后一个标记,而不管它是数字还是单词,也不管变量中有多少标记/单词 我将向批处理文件传递一个参数,如下所示: @echo off SET var=%1 SET last=some command to grab the last token of %var% echo %last% exit C:\execbatch.bat“这是一个示例” 或 C:\execbatch.bat“这是示例2” 然后批处理文件将如下所示: @echo off SET var=%

在批处理文件中,如何获取变量中的最后一个标记,而不管它是数字还是单词,也不管变量中有多少标记/单词

我将向批处理文件传递一个参数,如下所示:

@echo off

SET var=%1
SET last=some command to grab the last token of %var%
echo %last%
exit
C:\execbatch.bat“这是一个示例”
C:\execbatch.bat“这是示例2”

然后批处理文件将如下所示:

@echo off

SET var=%1
SET last=some command to grab the last token of %var%
echo %last%
exit
本质上,我需要能够始终获取最后一个标记,在这些示例中,我希望从示例1和示例2中获取
1

其他信息:

问题不是命令行参数,这只是一个简化的示例:

在这种情况下,我在批处理文件中调用一个命令,并将其输出发送到一个变量,如下所示:

C:\execbatch.bat内存
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%"

这将根据检查类型输出各种结果;但是,在任何情况下,最后一个标记/变量始终是当前值,尽管是数字或单词。

如果坚持只传递一个参数,则可以使用子例程:

@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或其他批处理文件中使用它,这有点烦人。

为什么这么复杂

@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
变量中字符串的解决方案: 回显上次=%last% 外部命令结果的解决方案:
伊莱的答案上有一些密码

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

如果标记之间用空格分隔,则最后一个标记为:

set b=command to grab the last token
for %i in (%b: =\%) do echo %~ni

对不起,看来我把我的处境简化了一点。我已经编辑了我的文章,详细介绍了情况。@Eli,在这种情况下,你应该也能很好地使用子程序。只需使用
call:get_last%COMMANDOUTPUT%
或将其直接粘贴到
for
+1中,但正如示例所示,可能必须在调用之前删除引号this@jeb:如果该工具输出引号内的所有内容,我会感到惊讶。但如果它真的这样做了,用子字符串或一行子程序来解决这个问题就很简单了;然而,我最终找到了一个可行的解决方案。这非常有效,特别是当您需要非空格标记分隔符时,例如“tokens=1*delims=”将在句点而不是空格上溢出。
set var1=这是一个(短)字符串。
:“String”此时出乎意料。”
set b=command to grab the last token
for %i in (%b: =\%) do echo %~ni