我有这个批处理文件,我需要跳过某些行的“echo”。我想跳过的行是:
W;;
A;;TE;Tr100;8;;31.79;SHIP-TE50;;
A;;TE;Tr100;8;;33.08;SHIP-TE50;;
and so on .
我想仅使用A;;TE;Tr100;
通配符来捕获行并跳过显示。它适用于W;;
但不适合A;;TE;
我该怎么做?
@ECHO OFF
cls
SETLOCAL ENABLEDELAYEDEXPANSION
SET /a number=%1-1
SET "sourcedir=z:\abc\def\ghi"
SET "filename1=%sourcedir%\jklm%number%.gwl"
SET "last="
FOR /f "delims=" %%a IN ('sort "%filename1%"') DO (
IF "%%a"=="W;;" goto :break
IF "%%a"=="A;;TE;*" goto :break
IF "%%a"=="!last!" ECHO %%a
SET "last=%%a"
)
:break
GOTO :EOF
答案1
阅读if /?
;您正在使用IF [NOT] string1==string2 command
语法模式:
string1==string2 Specifies a true condition if the specified text strings match.
没有通配符。不过,你可以充分利用FINDSTR
命令:
FINDSTR
将设置%ERRORLEVEL%
如下:
- 0(假)在至少一个文件的至少一行中发现匹配项。
- 如果在任何文件的任何行中都找不到匹配项(或者根本没有找到该文件),则为 1(真)。
- 2 语法错误
无效的开关只会在错误流中打印错误消息。
常用表达(搜索文本模式)
FINDSTR
可以使用以下具有特殊含义的元字符作为运算符或分隔符。FINDSTR
对正则表达式的支持是有限且非标准,仅支持以下元字符:
. Wildcard: any character
* Repeat: zero or more occurances of previous character or class
^ Line position: beginning of line
$ Line position: end of line
… etc.
下面的代码片段可能会有所帮助:
SET "last="
FOR /f "delims=" %%a IN ('sort "%filename1%"') DO (
echo("%%a"|>NUL findstr "^\"A;;TE;.* ^\"W;;\"$"
IF !errorlevel! EQU 0 (
rem match:
rem either lines starting with A;;TE;
rem or lines equal to W;;
rem goto :break
) else (
IF "%%a"=="!last!" ECHO %%a
SET "last=%%a"
)
)
:break