2016-12-29 12 views
0

Я пытаюсь прочитать в строке из файла, содержащего двоеточие и восклицательный знак. Когда я повторяю эту строку, он показывает только ПОСЛЕ двоеточия. Мне нужно оставить включенную расширенную версию для более продвинутого кода, который я буду делать в цикле do. Но сейчас я просто хочу правильно отследить. Любая помощь будет оценена!Пакет: чтение в строке из файла с двоеточием и восклицанием

Файл будет сказать что-то вроде:

! 12345 APX: 6,32

код, я попытался был:

setlocal EnableDelayedExpansion 
cd C:\Users\jwagh\Desktop\ 
for /f "usebackq delims=" %%a in (test.txt) DO (
setlocal DisableDelayedExpansion 
echo %%a 
set line=%%a 
set example=%line:~0,-1% 
echo %example% 
) 
+0

Отключить задержку расширения при расширении '%% a' и включить его только тогда, когда вам это действительно нужно ... – aschipfl

+0

Я попытался включить его в do-loop, и он не работает. – Wajo357

+0

«Это не работает» не совсем точное описание, не так ли? Возможно, вам стоит разместить немного кода, поэтому вам может быть проще помочь. В общем, вам нужно рассмотреть локализацию среды 'setlocal' /' endlocal', и вам нужно знать, что уровень вложенности таких блоков ограничен, поэтому вам нужно «endlocal» в цикле, когда у вас есть 'setlocal 'there ... – aschipfl

ответ

1

Возможно отключение delayedexpansion является единственным практически возможным решением, но в зависимости от ваших данных, настройка delims для ! бы установить %%a на всю линию, минус начальный ! (при условии, что, очевидно, только одна ! -последовательность известной длины и всегда ведет линию)

OR

for /f "usebackq delims=!" %%a in (%FamilyFile%) DO echo ^^!%%a 
+0

Это то, что я закончил делать. Спасибо! – Wajo357

1

только пуленепробиваемые решение отключить delayed expansion при расширении %%a, и включить его только тогда, когда это действительно необходимо. Например, что-то вроде этого:

setlocal DisableDelayedExpansion 
for /F "usebackq delims=" %%a in (%File%) do (
    set "Item=%%a" 
    setlocal EnableDelayedExpansion 
    echo(!Item:,-1! 
    endlocal 
) 

С локализованными средах, созданных setlocal/endlocal блоков ограничены с точки зрения вложенности, вам нужно положить также endlocal внутри цикла. Считайте, что после endlocal все изменения в окружающей среде, так как последние setlocal теряются.


Но теперь нечто совсем другое (относительно revision 3 вопроса):
Я предполагаю, что %File% держит цитируемый файла путь/имя, из-за опции usebackq.
Позвольте мне рекомендовать не включать кавычки в значение переменной, используя следующий синтаксис:

set "File=D:\Data\file.ext" & rem // (particularly note the position of the opening quote) 

Ссылка this post, чтобы узнать, почему это лучше.