String 批处理脚本问题,扩展延迟,字符串中出现感叹号

String 批处理脚本问题,扩展延迟,字符串中出现感叹号,string,batch-file,delay,expansion,String,Batch File,Delay,Expansion,我有一个以下格式的文件。每行记录三个值,用|分隔。我已经编写了一个批处理脚本来验证每行中是否有3条记录,并报告是否有任何不良记录(少于或多于3个值) 值11 |值12 |值13 | 值21 |值22 |值23 | 价值31 |价值32 |价值33| PSUEDO代码: 对于文件中的每一行,执行 (1) 将行读取到变量。 (2) 写入临时文件并获取文件长度。 (3) 将|从线路上移除。 (4) 将此修改行写入临时文件并获取文件长度。 (5) 两个计算长度之间的差值给出值count 代码: 问题:

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

值11 |值12 |值13 |
值21 |值22 |值23 |
价值31 |价值32 |价值33|

PSUEDO代码:

对于文件中的每一行,执行
(1) 将行读取到变量。
(2) 写入临时文件并获取文件长度。
(3) 将|从线路上移除。
(4) 将此修改行写入临时文件并获取文件长度。
(5) 两个计算长度之间的差值给出值count

代码:

问题: 问题来了,当有!在文件中,并设置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  
   .
   .
如果有人能帮忙,我将不胜感激!!
注意:实际文件包含数百条记录。

您可以在开始时使用
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
)
但当一行以
开头时,即使这样也会失败和空行也被删除


对于完整的解决方案,您可以阅读

切换delayedexpansion仅在循环中的特定次数下有效。一旦达到最大计数,切换就不起作用。切换可以无限工作,但重要的是添加相同数量的
endlocal
for /f "delims=" %%m in (!file_name!) do (
  setlocal DisableDelayedExpansion
  set "current_line=%%m"
  setlocal EnableDelayedExpansion
  echo(!current_line!>temp_file  
  ...
  endlocal
  endlocal
)