我想计算文本文件中的行数,然后将值存储到环境变量中 . 计算行数的命令是
findstr /R /N "^" file.txt | find /C ":"
我提到了问题How to store the result of a command expression in a variable using bat scripts?然后我试过了,
set cmd="findstr /R /N "^" file.txt | find /C ":" "
我收到错误消息,
FIND: Parameter format not correct
我怎么能摆脱这个错误 .
14 回答
您可以使用FOR / F循环将输出分配给变量 .
我使用
cmd-variable
,因此不需要转义cmd-string中的管道或其他字符,因为延迟扩展将字符串"unchanged"传递给FOR-Loop .有一种比所有其他方法简单得多的方法 .
显然,从传统的MS-DOS时代保留 . 更多信息:http://blogs.msdn.com/b/oldnewthing/archive/2011/08/25/10200026.aspx
使用示例:
如果您的Android设备已连接到您的PC并且您的路径上有Android SDK,则会打印出设备上安装的应用程序数量 .
受以前帖子的启发,这样做的方式更短:
行数
试试吧 . 它适用于我的控制台 .
已编辑:
(删除了“$”标志)
$将数字减少1,因为它接受第一行作为字段名称,然后计算行数 .
试试这个:
它消除了额外的FindStr,不需要扩展 .
TYPE
命令使其快三倍 .@Tony:你甚至可以摆脱
type %file%
命令 .对于长文件,这应该更快 .
我通常使用更像这样的东西
for /f %%a in (%_file%) do (set /a Lines+=1)
您不需要使用find .
这将迭代文件中的所有行,并将每行的计数器变量增加1 .
我发现这个解决方案最适合创建一个维护自己的日志文件:
包含的环境变量是%clientname%远程客户端的计算机名%%Date%是当前日期,%Time%是当前时间 . :获取文件中的行数后调用NEXT . 如果文件行数大于%maxlines%变量,则转到:EXITLOOP,它覆盖文件,创建一个带有第一行信息的新文件 . 如果它小于%maxlines%变量,它只是将该行添加到当前文件 .
在批处理文件中,使用%% A而不是%A
只是:
字体:https://superuser.com/questions/959036/what-is-the-windows-equivalent-of-wc-l
在下面的代码中,变量名称是
SalaryCount
和TaxCount
现在,如果您需要将这些值输出到csv文件,则可以使用以下代码 .
>
将覆盖文件的现有内容,>>
将新数据附加到现有数据 . CSV将在 D:\CSVOutputPath 中生成您可以将
type
的输出传递到for /f
循环的in(…)
子句中的find
:但是管道开始了一个子壳,这会减慢速度 .
或者,您可以将文件中的输入重定向到
find
,如下所示:但是如果文件以一个或多个空行结束,这种方法会给你一个比实际行数少1的答案,如counting lines in a file中已故的foxidrive所述 .
然后再次,你可以尝试:
麻烦的是,上面命令的输出如下所示:
您可以在冒号上拆分字符串以获取计数,但如果文件名具有完整路径,则可能有多个冒号 .
这是我对这个问题的看法:
这将始终将计数存储在变量中 .
只是最后一个小问题...
find
将空字符视为换行符 . 因此,如果偷偷摸摸的空值悄悄进入您的文本文件,或者如果您想计算Unicode文件中的行,则此答案不适合您 .下面的
:countLines
子程序接受两个参数:变量名称;和文件名 . 计算文件中的行数,结果存储在变量中,结果传递回主程序 .该代码具有以下功能:
使用Windows或Unix行结尾读取文件 .
处理Unicode以及ANSI / ASCII文本文件 .
应对极长的线条 .
不被空字符所迷惑 .
读取空文件时出错 .
超出批量最大限制
(31^2)-1
的计数 .我知道它看起来很可怕,但它涵盖了大多数边缘情况并且速度惊人 .
完美的解决方案是: