批处理文件从.tmp读取最后一行,即使它开头;字符

时间:2016-11-30 12:24:14

标签: batch-file

见到大家,我有一个奇怪的问题。

我有这个.tmp文件。

M l FNT;yriad_b
M l FNT;arial_bo
mm
zO
J
O R,P
H50,5,T
D -3.0,2.2

F98;arial_bo
F99;yriad_b
Sl1;0.0,0.0,100,100,100
P -1.8

T:Line01;6.5,6.5,0,98,pt23;XXX
G 0,8.5,0;L:70.5,0.7
T:Line04;5.5,14.2,0,99,pt18,q100;XXXX
T:Line05;5.5,18.2,0,99,pt9,q100;XXXX
T:Line88;5.5,26.0,0,99,pt21,q100;XXXX
T:Line08;5.5,68.0,0,99,pt21,q100;XXXX
B 5.5,70,9,code128, 7,.4;XXXX
T:Line99;5.5,61.8,0,99,pt11,q100;XXXX
B 5.5,85,5,code128, 7,.25;XXXX
T:Line09;5.5,82.8,0,99,pt17,q100;XXXX
T:Line10;5.5,33.3,0,99,pt17,q100;XXXX
B 5.5,35,2,code128, 7,.3;XXXX
T:Line11;5.5,48.1,0,99,pt18,q100;XX
T:Line19;16.0,48.1,0,99,pt18,q100;XX

B 5.5,50.0,0,code128, 7.0,.3;8


A 1







;ABC123

我需要获得最后一行,完全 ABC123 ,不带; 字符。 我目前正在使用下面的批处理脚本,如果我在ABC123之前没有; 字符,则可以使用。我不知道为什么批处理脚本会用; 字符跳过行星。

批处理脚本。

for /f "delims=" %%x in (c:\print\pack2.tmp) do set Build=%%x

有人可以帮助我吗?

由于

3 个答案:

答案 0 :(得分:3)

它会跳过以;开头的行,因为这是默认的EOL字符,另请参阅FOR /?

为避免这种情况,您可以将EOL更改为其他字符,例如

for /f "EOL=Y delims=" %%x in (c:\print\pack2.tmp) do set Build=%%x

如果您知道某个特定角色无法在此位置,那么您可以选择它。

或者您使用findtr封装文件,以便每行以行号开头(然后FOR/F也可以抓住空行)。

setlocal EnableDelayedExpansion
for /f "delims=" %%L in ('findstr /n "^" c:\print\pack2.tmp') do (
   set "line=%%L"
   set "Build=!line:*:=!"
)

答案 1 :(得分:1)

由于for /F循环的eol选项默认为;字符,因此会跳过该行。

delims选项不同,您不能通过声明选项字符串eol来简单地禁用"eol="选项,因为这会将其设置为"字符。类似"eol= delims="的字符串也不起作用,因为这会将 SPACE 作为eol字符。

要禁用eol选项,有几种可能性:

  1. 将其隐藏在delims选项后面:

    for /F "usebackq eol=, delims=," %%L in ("file.txt") do set "Build=%%L"
    

    为其中一个eol字符指定delims个字符会将eol设为delims,因为for /F似乎优先于eoldelimsfor /F usebackq^ delims^=^ eol^= %%L in ("file.txt") do set "Build=%%L" 的顺序无关紧要。

  2. 使用奇怪的不带引号的语法:

    ,

    每个令牌分隔符( SPACE TAB ;=0xFF以及非中断空格{ {1}})必须通过前面的^进行转义。此处,必须将eol指定为最后一个选项。未转义的 SPACE 不会被视为eol字符,因为解析器会将其用于将选项字符串与for变量引用%%L分开。 / p>

  3. 使用奇数换行符语法:

    for /F usebackq^ eol^=^
    
    delims^= %%L in ("file.txt") do set "Build=%%L"
    

    此处必须填写空行。 ^部分之后的eol^=构成行继续,因此忽略第一个换行符(CR + LF,回车换行序列)。下一个字符,LF(解析器在读取代码行时已经跳过CR),字面上被视为eol字符。由于在标记行尾的文本行中不会出现这种情况,因此最终会禁用eol选项。

答案 2 :(得分:0)

REM

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q40888302.txt"
FOR /f "usebackqtokens=1*eol=;delims=; " %%a IN ("%filename1%") DO (
SET var=%%~a
)
ECHO "%var%"
GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q40888302.txt的文件,其中包含我的测试数据。