字符串

时间:2015-11-19 10:51:39

标签: string batch-file delay expansion

我有一个以下格式的文件。每行是由|分隔的三个值的记录。我编写了一个批处理脚本来验证每行是否有3条记录,并报告是否有任何不良记录(少于或多于3个值)

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

PSUEDO代码:

对于文件中的每一行,DO
(1)读取变量的行 (2)写入临时文件并获取文件长度 (3)删除|从线 (4)将此修改后的行写入临时文件并获取文件长度 (5)两个计算长度之间的差异给出了值计数

代码:

@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  
   .
   .

感谢有人可以提供帮助!! 注意:实际文件包含数百条记录。

1 个答案:

答案 0 :(得分: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
)

但是当一行以;开头并且空行也被删除时,即使这种情况也会失败。

要获得完整的解决方案,请阅读Batch files: How to read a file?