Вот вариант, не полагаясь на EnableDelayedExpansion
, при условии, что выход из разделенных запятыми значений (CSV), строка хранится в %CSVSTRING%
, и что ни один из входных значений не являются пустыми:
@echo off
echo.%CSVSTRING%
rem initialise variables
set LASTCOLUMN=
set /A COUNTER=0
:LOOPBEGIN
rem there is a simple `goto` loop to prevent delayed expansion
set /A COUNTER+=1
for /F "tokens=%COUNTER% delims=," %%A in ("%CSVSTRING%") do (
if "%%A"=="" goto :LOOPEND
set LASTCOLUMN=%%A
goto :LOOPBEGIN)
:LOOPEND
echo.%LASTCOLUMN%
Относительно того, что количество токен CSV ограничено 31 (в строке) из-за команды for
!
Чтобы получить строку CSV, хранящуюся в переменной %CSVSTRING%
, существуют следующие способы (например, команда echo a,b,c,d
используется здесь):
перенаправив вывод CSV временный файл:
rem store CSV string to temporary file
(echo a,b,c,d) > list.tmp
rem load temporary file into variable
set /P CSVSTRING= < list.tmp
rem delete temporary file (remove `/P` to avoid prompt)
del /P list.tmp
rem notice that `(echo a,b,c,d) | set /P CSVSTRING=` will not work!
Вложение команды, которая возвращает выход CSV в команду for
:
rem command returning the CSV string is embedded in `for` command
for /F "delims=" %%A in ('echo a^,b^,c^,d') do set CSVSTRING=%%A
rem all the `,` must be escaped with `^` here in this sample,
rem otherwise they will be repaced by spaces
перенаправив вывод CSV для пакетного сценария из верхней части этого ответа (назовем его seeklast.bat
):
команда должна быть предоставлена как это:
(echo a,b,c,d) | seeklast.bat
командный скрипт, который ищет последний токен CSV (seeklast.bat
), должен начинаться с этого:
rem pipe output of command returning CSV string into the batch
set /P CSVSTRING=
Если вы хотите, чтобы предоставить строку CSV в качестве аргумента командной строки к выше пакетному сценарию (seeklast.bat
), он должен начать с этого:
set CSVSTRING=%*
Является ли число столбцов ограниченное каким-то образом (мин./макс.)? – aschipfl