2012-01-05 187 views
1

我尝试制作一个.bat文件,根据匹配条件的行数量,将空行添加到文本文件中。这是什么:如何将命令的结果批量存储到变量中?

@echo 
SET /a maxLineas = 50 
SET cantLineasDetalle="type texto.txt | find /i /c "D01" " 
SET /a cantLineasAgregar = %maxLineas% - %cantLineasDetalle% 

:loop 
echo. >> texto.txt 
set /a cantLineasAgregar-=1 
if %cantLineasAgregar% GTR 0 goto loop 

麻烦的是,var“cantLineasDetalle”没有存储我希望它做的值。

如何分配执行结果'type texto.txt |找到/我/ C“D01”'变量?

在此先感谢, 埃斯特万。

回答

1

正如前面的答复中指出,您使用FOR/F循环将命令的结果存储到变量中。

find "search" <file如果文件很大,可以比type file | find "search"更有效。

当在FOR/F IN()子句中执行时,所有特殊字符都必须加引号或转义。在你的情况下,管道将需要逃脱,或者如果你采取我的建议,<将需要逃脱。

echo. >>file将向该文件附加一行空格。此外,使用echo(而不是echo.更安全,但您可能永远不会遇到回显问题。要获得没有空间的空行,请使用echo(>>file

使用SET/A进行数学运算时,可以直接引用变量而不用百分比将它们括起来。它也适用于百分比。

最后,在FOR/L循环中追加行而不是使用GOTO循环会更有效率。

@echo off 
set /a maxLineas=50 
for /f %%N in('find /i /c:"D01" ^<texto.txt') do set /a cantLineasDetalle=%%N 
set /a cantLineasAgregar=maxLineas-cantLineasDetalle 
for /l %%N in (1 1 %cantLineasAgregar%) do echo(>>texto.txt 

整个脚本可以被压缩到以下(maxLineas现在0基于)

@echo off 
set /a maxLineas=50-1 
for /f %%N in('find /i /c:"D01" ^<texto.txt') do for /l %%I in (%%N 1 %maxLineas%) do echo(>>texto.txt 
+0

谢谢。就在你回应之前的几分钟,我已经找到了与控制台一起玩的答案。这就是我所做的:“for/f”tokens = 3“%% G in('find/i/c”D01“C:\ texto.txt')SET SET cantLineasDetalle = %% G”但是我会用你的推荐来修改我的代码。我真的赞赏你的答案。再次感谢。 – t3b4n 2012-01-05 20:00:57

+1

@ t3b4n - FIND古怪:FIND搜索文件不同于FIND搜索文件。第一行生成2行:文件名,然后是count。第二只产生计数。你可能想要第二种形式。 – dbenham 2012-01-05 20:16:40

0

FOR/F %%我在( '型texto.txt |找到/ I/C “D01”')做SET cantLineasDetalle = %%我

+0

谢谢您的回答,但它不工作。它显示错误:“|不是预期的”。我用你的代码替换了第四行代码以获得结果。 – t3b4n 2012-01-05 18:52:25

+0

问题是'|'必须在IN()子句内部转义 – dbenham 2012-01-05 20:17:31

+0

我的Windows-Fu已经变得相当生锈 - 很长一段时间,因为我抛光了它。 – 2012-01-05 20:18:19

相关问题