Последний токен в пакетной переменной - PullRequest
7 голосов
/ 29 марта 2011

В пакетном файле как я могу получить последний токен в переменной независимо от того, является ли это число или слово, и независимо от того, сколько токенов / слов содержится в переменной.

Я будупередать аргумент в пакетный файл следующим образом:

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

По существуМне нужно всегда иметь возможность получить последний токен, в этих примерах я бы хотел получить one из примера 1 и 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%"

Это будет выводить различные результаты в зависимости от проверкитип;однако в каждом случае последний токен / переменная всегда является текущим значением, хотя это либо число, либо слово.

Ответы [ 4 ]

6 голосов
/ 10 мая 2012

Почему так сложно?

Решение для строки в переменной:

set var1=This is a String
for %%A in (%var1%) do set last=%%A

echo last =% last%

Решение для результата внешней команды:

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%
5 голосов
/ 30 марта 2011
@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
1 голос
/ 29 марта 2011

Если вы настаиваете на передаче только одного аргумента, вы можете использовать подпрограмму:

@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 в пакетный файл, поскольку он выходит из командного процессора, а не из пакетного файла.Это немного раздражает, если вы используете его непосредственно из оболочки или из других командных файлов.

0 голосов
/ 13 февраля 2017

Немного кода в ответе Элая.

@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 (
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...