проблема с пакетным скриптом с задержкой расширения и восклицательным знаком в строке

У меня есть файл следующего формата. Каждая строка представляет собой запись трех значений, разделенных символом |. Я написал пакетный скрипт, чтобы проверить, есть ли в каждой строке 3 записи, и сообщить, есть ли какие-либо плохие записи (меньше или больше 3 значений).

VALUE11|VALUE12|VALUE13|
VALUE21|VALUE22|VALUE23|
VALUE31|VALUE32|VALUE33|

ПСЕВДО-КОД:

Для каждой строки в файле DO
(1) Прочитать строку в переменную.
(2) Записать во временный файл и получить длину файла.
(3) Удалить | из строки.
(4) Запишите эту измененную строку во временный файл и получите длину файла.
(5) Разница между двумя вычисленными длинами дает значение count

Код:

@echo off
setlocal EnableDelayedExpansion
set /A column_count=3
set file_name=%1  

for /f "delims=" %%m in (!file_name!) do (
  set current_line=%%m
  echo.!current_line!>temp_file  

  :: Get length
  for %%s in (temp_file) do set /a curr_line_length=%%~zs  

  :: Remove |
  set "current_line_withoutpipes=!current_line:|=!"
  echo.!current_line_withoutpipes!>temp_file  

  :: Get new length
  for %%s in (temp_file) do set /a current_line_withoutpipes_length=%%~zs  

  :: Diff gives the pipe count 
  set /A line_column_count=!curr_line_length!-!current_line_withoutpipes_length!  

  if !column_count! EQU !line_column_count! (
            echo Good record
    ) else (
            echo bad record
    )   
  )
  endlocal

Проблема: Проблема возникает, когда есть ! в файле и установлен DelayedExpansion. Персонажи между двумя! усекаются, когда они установлены в переменную. Чтобы решить эту проблему, я поставил endlocal, а затем снова установил DelayedExpansion. С этим изменением проблема ! разрешается, но переменные, определенные до "endlocal", больше не доступны после оператора "endlocal".

Измененный код:

 .
 .
 for /f "delims=" %%m in (!file_name!) do (  
   endlocal & set current_line=%%m  
   setlocal EnableDelayedExpansion  
   echo.!current_line!>temp_file  
   .
   .

Оцените, если кто-то может помочь! ПРИМЕЧАНИЕ. Фактический файл содержит сотни записей.


person user1270817    schedule 19.11.2015    source источник


Ответы (1)


Вы можете использовать setlocal вместо endlocal в начале.

for /f "delims=" %%m in (!file_name!) do (
  setlocal DisableDelayedExpansion
  set "current_line=%%m"
  setlocal EnableDelayedExpansion
  echo(!current_line!>temp_file  
  ...
  endlocal
  endlocal
)

Но даже это не удается, если строка начинается с ; и пустые строки тоже удаляются.

Для полного решения вы можете прочитать Пакетные файлы: как прочитать файл?

person jeb    schedule 19.11.2015
comment
Переключение отложенного расширения работает только определенное количество раз в цикле. После достижения максимального количества переключение не работает. - person user1270817; 19.11.2015
comment
Переключение работает неограниченно, но важно, чтобы вы добавили одинаковое количество endlocal - person jeb; 19.11.2015