我有一个外部过程,基本上需要调用:
int myInt = exec('find /v /c "" filepath');
它正在计算文本文件中的行数。 如果有一个更好的方法来获得也很好的整数量。
使用查找,完整的命令会返回除了计数以外的一些信息,例如,它会为每个事件(文件名)返回一些破折号,然后:10。
所以:
---------- filepath :10
有什么办法可以find只返回整数部分? 或者,我需要将输出传送到另一个进程(类似于UNIX上的grep)?
find
时使用文件输出---------- file.txt :10
。 如果它处理STDIN,它只给你数字:
find /v /c "" <file.txt
要将此输出转换为变量,请将此for
Statement:
for /f %%i in ('find /v /c "" ^<file.txt') do set myint=%%i echo %myint%
(用于命令行,使用单个%i
而不是%%i
)
我相信你需要将find
的结果输入到诸如findstr
2之类的其他实用程序中。
原因是:/ C选项Displays only the count of lines containing the string.
。
根据您提供的搜索文件filepath
,可能会有多个条目返回。 为了确保结果是有意义的, find
必须为你提供文件filepath
,以便为你提供适当的上下文。
所以你会想要发布一个像这样的东西:
int myInt = exec('find /v /c "" 'filepath' | findstr /r ': [0-9]*');
1 请注意:我没有验证在findstr
中的正则findstr
将工作。
2 显然findstr
返回整个行,所以你需要找到一个不同的命令。
你可以用这个语法来做到这一点:
type filepath | find /c /v ""
原始来源在这里 。
type filepath
返回文件的行,而
find /c /v ""
返回它们的数量(显然“搜索项是查找的一个bug特性,允许你计算行数)。
你可以尝试用下面的命令行替换find /v /c "" filepath
部分:
cmd /V:ON /C "for /F "delims=" %L in ('find /V /C "" "filepath"') do set "LINE=%L" & echo LINE=!LINE:*: =!"
或者用下面类似的代码创建一个批处理文件(称为line_cnt.bat
,代替find
命令行:
@echo off setlocal EnableDelayedExpansion for /F "delims=" %%L in (' find /V /C "" "filepath" ') do ( set "LINE=%%L" echo !LINE:*: =! ) endlocal
为了达到这个目的,你需要把它放在你的进程正确的工作目录下,用它的完整路径调用line_cnt.bat
,或者把它包含的目录包含在你系统的搜索PATH
中。
这适用于我在Windows 7上:
type pretty-print-example.R |\windows\system32\find.exe /i /v /c ""
输出只是行数,82