如何将文本与命令字进行比较

时间:2013-12-19 16:27:05

标签: batch-file text

我对这个批处理文件的总体目标是运行一个.txt文件并在Th-: -2.000000 Th+: -0.160000 - In Limits之后获取所有行(这是测试的限制,总是直接在相同的数据之后)并且停止交流结束测试“通过”或“失败”。截至目前我有这段代码:

@echo off
setlocal EnableDelayedExpansion
set flag = N
for /f "tokens=*" %%a in (input.txt) do 
(
    set temp=%%a
    echo !flag!
    if "%%a" == "Pass\par" set flag=N
    if !flag! == Y  echo. %%a >> output.txt
    if "%%a" == "Th-:  -2.000000   Th+:  -0.160000   - In Limits\par" set flag=Y
)
pause

这设置了一个标志= N,除非标志= Y,否则不会写一行。该标志在给定行后变高。我的问题是,在“”将标志置为高位的情况下,有一个'+'和'In'是批量关键字,我将如何评论这些以将它们包含在文本中?

非常感谢我的代码的任何其他建议。

编辑 - 文本文件如下所示:

Th-:  -2.000000   Th+:  -0.160000   - In Limits

Die 1  :  -0.205359   Pass 

Die 2  :  -0.210690   Pass 

Die 3  :  -0.215712   Pass 

Die 4  :  -3.458495   Fail 

Die 5  :  -0.210452   Pass 

FAIL

我试图将中间线移动到另一个文本文件

2 个答案:

答案 0 :(得分:0)

我不知道这是不是你想要的,但我会提供一个可以帮助你的脚本,它会创建3个带有文件内容的变量,1个变量包含文件的全部内容。 Txt,其他变量包含指定文本之前的所有内容,另一个变量包含指定文本之后的所有内容。

@echo off
@break off
@title How to compare text with a command word - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

REM CRLF = Breakline Trick in Batch | P.S: Is need two breaklines between caret char and next command, don't remove the two breaklines

set CRLF=^


REM Start of Script
set "InputContentsAll="
set "InputContentsBefore="
set "InputContentsAfter="

set "FLAG=N"

for /F "usebackq tokens=*" %%a in ( "input.txt" ) do (
  set "InputContentsAll=!InputContentsAll!!CRLF!%%~a"
  if "%%~a" EQU "Th-: -2.000000 Th+: -0.160000 - In Limits" (
    set "FLAG=Y"
  ) else (
    if /I "!FLAG!" EQU "N" (
      if not defined InputContentsBefore (
        set "InputContentsBefore=%%~a"
      ) else (
        set "InputContentsBefore=!InputContentsBefore!!CRLF!%%~a"
      )
    ) else if /I "!FLAG!" EQU "Y" (
      if not defined InputContentsAfter (
        set "InputContentsAfter=%%~a"
      ) else (
        set "InputContentsAfter=!InputContentsAfter!!CRLF!%%~a"
      )
    )
  )
)

:: Variable InputContentsBefore = Before of "Th-: -2.000000 Th+: -0.160000 - In Limits"
:: Variable InputContentsAfter  = After  of "Th-: -2.000000 Th+: -0.160000 - In Limits"
:: Variable InputContentsAll    = All Contents of file input.txt

:: echo !InputContentsBefore!
:: echo !InputContentsAfter!
:: echo !InputContentsAfter!

pause
exit

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
set flag=N
for /f "delims=" %%a in (q20686770.txt) do (
 IF NOT DEFINED flag ECHO %%a >>output.txt
 IF "%%a"=="PASS" SET flag=N
 IF "%%a"=="FAIL" SET flag=N
 if "%%a"=="Th-:  -2.000000   Th+:  -0.160000   - In Limits" set "flag="
)
GOTO :EOF

这应该适合你。

注意:我将输入文件名更改为q20686770.txt以进行测试 - 您需要将其更改回来。

批处理对SET语句中的空格敏感。 SET FLAG = N将名为“FLAG Space ”的变量设置为值“ Space N”

TEMPTMP是特殊的变量名,用于指定临时文件目录的位置。最好不要改变它们,因为可能会出现意想不到的结果。

“\ par”是一个文字文本字符串 - \很少用作批处理中的正则表达式转义字符 - 当然不在if语句中。

不幸的是,告诉我们how您的代码不起作用对于传播它应该做的what并不是很有用。没有迹象表明您打算输出什么。对于istance,您没有说明是否要输出最终的“PASS / FAIL”行,或者是否需要间距。

NOT输出最终的“PASS / FAIL”,只需移动if not defined行之后的if..fail..行。

任何现有APPENDED的输出均为output.txt。如果要创建新的output.txt,则需要在批处理开始时将其删除。为此,只需插入一个新行

即可
del output.txt 2>nul

FOR...行之前的某个地方。有 ARE 这样做的其他方法,但这种方式做出的改动最少(因此更容易解释。)显然,该行删除了文件,但如果文件没有,也会删除任何错误消息存在。