Важное обновление - Я не думаю, что пакет Windows является хорошим вариантом для ваших нужд, потому что один FOR / F не может анализировать более 31 токена. См. Пояснение в нижней части приложения ниже.
Однако с пакетом можно делать все, что вы хотите. Этот уродливый код даст вам доступ ко всем 64 токенам.
for /f "usebackq tokens=1-29* delims=," %%A in ("%filename%") do (
for /f "tokens=1-26* delims=," %%a in ("%%^") do (
for /f "tokens=1-9 delims=," %%1 in ("%%{") do (
rem Tokens 1-26 are in variables %%A - %%Z
rem Token 27 is in %%[
rem Token 28 is in %%\
rem Token 29 is in %%]
rem Tokens 30-55 are in %%a - %%z
rem Tokens 56-64 are in %%1 - %%9
)
)
)
В приложении содержится важная информация о том, как работает вышеперечисленное.
Если вам нужно всего лишь несколько токенов, распределенных среди 64 строк, то решение будет несколько проще, поскольку вы сможете избежать использования сумасшедших символов в качестве переменных FOR. Но предстоит еще тщательная бухгалтерия.
Например, следующее даст вам доступ к токенам 5, 27, 46 и 64
for /f "usebackq tokens=5,27,30* delims=," %%A in ("%filename%") do (
for /f "tokens=16,30* delims=," %%E in ("%%D") do (
for /f "tokens=4 delims=," %%H in ("%%G") do (
rem Token 5 is in %%A
rem Token 27 is in %%B
rem Token 46 is in %%E
rem Token 64 is in %%H
)
)
)
Апрель 2016 г. Обновление - На основе исследовательской работы пользователей DosTips Aacini, penpen и aGerman я разработал относительно простой метод одновременного доступа к тысячам токенов с помощью FOR / F. Работа является частью этой ветки DosTips . Фактический код можно найти в этих 3 сообщениях:
Оригинальный ответ
Переменные FOR ограничены одним символом, поэтому ваша стратегия %% BL не может работать. Переменные чувствительны к регистру. Согласно Microsoft, вы можете ограничиться получением 26 токенов в одном операторе FOR, но вы можете получить больше, если будете использовать больше, чем просто альфа. Это боль, потому что вам нужна таблица ASCII, чтобы выяснить, какие символы куда идут. Однако FOR не допускает использования каких-либо символов, а максимальное количество токенов, которое может назначить один FOR / F, составляет 31 +1. Как вы обнаружили, любая попытка разобрать и назначить больше 31 потерпит неудачу.
К счастью, я не думаю, что вам нужно столько токенов. Вы просто указываете, какие токены вы хотите с опцией TOKENS.
for /f "usebackq tokens=7,12,15,18 delims=," %%A in ("%filename%") do echo %%A,%%B,%%C,%%D
даст вам 7-й, 12-й, 15-й и 18-й жетоны.
Добавление
Апрель 2016 г. Обновление Пару недель назад я узнал, что следующие правила (написанные 6 лет назад) зависят от кодовой страницы. Приведенные ниже данные были проверены для кодовых страниц 437 и 850. Что более важно, последовательность переменных FOR расширенных символов ASCII 128-254 не соответствует байту кодовое значение, и сильно зависит от кодовой страницы. Оказывается, отображение переменных FOR / F основано на базовой кодовой точке UTF- (16?). Поэтому расширенные символы ASCII имеют ограниченное использование при использовании с FOR / F. См. Нить в http://www.dostips.com/forum/viewtopic.php?f=3&t=7703 для получения дополнительной информации.
Я провел несколько тестов и могу сообщить следующее (обновлено в ответ на комментарий Джеба) :
Большинство символов можно использовать в качестве переменной FOR, включая расширенный ASCII 128-254. Но некоторые символы нельзя использовать для определения переменной в первой части инструкции FOR, а можно использовать в предложении DO. Некоторые не могут быть использованы ни для одного. Некоторые не имеют ограничений, но требуют специального синтаксиса.
Ниже приводится краткое описание символов, которые имеют ограничения или требуют специального синтаксиса. Обратите внимание, что текст в угловых скобках, например <space>
, представляет собой один символ.
Dec Hex Character Define Access
0 0x00 <nul> No No
09 0x09 <tab> No %%^<tab> or "%%<tab>"
10 0x0A <LF> No %%^<CR><LF><CR><LF> or %%^<LF><LF>
11 0x0B <VT> No %%<VT>
12 0x0C <FF> No %%<FF>
13 0x0D <CR> No No
26 0x1A <SUB> %%%VAR% %%%VAR% (%VAR% must be defined as <SUB>)
32 0x20 <space> No %%^<space> or "%%<space>"
34 0x22 " %%^" %%" or %%^"
36 0x24 $ %%$ %%$ works, but %%~$ does not
37 0x25 % %%%% %%~%%
38 0x26 & %%^& %%^& or "%%&"
41 0x29 ) %%^) %%^) or "%%)"
44 0x2C , No %%^, or "%%,"
59 0x3B ; No %%^; or "%%;"
60 0x3C < %%^< %%^< or "%%<"
61 0x3D = No %%^= or "%%="
62 0x3E > %%^> %%^> or "%%>"
94 0x5E ^ %%^^ %%^^ or "%%^"
124 0x7C | %%^| %%^| or "%%|"
126 0x7E ~ %%~ %%~~ (%%~ may crash CMD.EXE if at end of line)
255 0xFF <NB space> No No
Специальные символы, такие как ^
<
>
|
&
, должны быть либо экранированы, либо заключены в кавычки. Например, следующие работы:
for /f %%^< in ("OK") do echo "%%<" %%^<
Некоторые символы нельзя использовать для определения переменной FOR. Например, следующее дает синтаксическую ошибку:
for /f %%^= in ("No can do") do echo anything
Но %%=
может быть неявно определено с помощью опции TOKENS, а значение, доступное в предложении DO, выглядит следующим образом:
for /f "tokens=1-3" %%^< in ("A B C") do echo %%^< %%^= %%^>
%
нечетно - Вы можете определить переменную FOR, используя %%%%
. Но значение не может быть доступно, если вы не используете модификатор ~
. Это означает, что заключенные в кавычки не могут быть сохранены.
for /f "usebackq tokens=1,2" %%%% in ('"A"') do echo %%%% %%~%%
Вышеуказанные выходы %% A
~
является потенциально опасной переменной FOR. Если вы попытаетесь получить доступ к переменной, используя %%~
в конце строки, вы можете получить непредсказуемые результаты и даже может привести к сбою CMD.EXE! Единственный надежный способ получить к нему доступ без ограничений - использовать %%~~
, что, конечно, удаляет любые заключающие в кавычки.
for /f %%~ in ("A") do echo This can crash because its the end of line: %%~
for /f %%~ in ("A") do echo But this (%%~) should be safe
for /f %%~ in ("A") do echo This works even at end of line: %%~~
Символ <SUB>
(0x1A) является специальным, поскольку литералы <SUB>
, встроенные в пакетные сценарии, читаются как перевод строки (<LF>
). Чтобы использовать <SUB>
в качестве переменной FOR, значение должно быть каким-то образом сохранено в переменной среды, и тогда %%%VAR%
будет работать как для определения, так и для доступа.
Как уже говорилось, один FOR / F может анализировать и назначать максимум 31 токен. Например:
@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%n in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1-31" %%A in ("!str!") do echo A=%%A _=%%_
Выше приведено A=1 _=31
Примечание - токены 2-30 работают отлично, я просто хотел небольшой пример
Любая попытка разобрать и назначить более 31 токена молча провалится без установки ERRORLEVEL.
@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%n in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1-32" %%A in ("!str!") do echo this example fails entirely
Вы можете проанализировать и назначить до 31 токена и назначить остаток другому токену следующим образом:
@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%0 in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1-31*" %%@ in ("!str!") do echo @=%%A ^^=%%^^ _=%%_
Вышеуказанные выходы @=1 ^=31 _=32 33 34 35
А теперь о действительно плохих новостях. Один FOR / F никогда не может анализировать более 31 токена, как я узнал, когда посмотрел на Ограничение числа токенов в команде FOR в Пакетный скрипт Windows
@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%n in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1,31,32" %%A in ("!str!") do echo A=%%A B=%%B C=%%C
Очень неудачный вывод A=1 B=31 C=%C