我目前有这个批处理代码,它告诉我这个字符串在文本文件中出现的次数。
@ECHO OFF
set /a Numb=0
for /f %%i in ('FINDSTR /N .* %1') do (set /a Numb+=1)
echo %Numb%
我需要另一段代码将文本所在的行号输出到一个变量。
如何将文本文件中包含特定字符串的行的行号存储在环境变量中?
最佳答案
我的这个任务的批处理代码需要指定文件名和搜索字符串作为参数来运行批处理文件并进行一些错误检查:
@echo off
setlocal EnableDelayedExpansion
set "FileName=%~1"
set "Search=%~2"
rem Exit batch file if the two required arguments were not specified.
if "%FileName%" == "" (
echo Error: There is no file name specified as first parameter.
goto ErrorOuput
)
if "%Search%" == "" (
echo Error: There is no search string specified as second parameter.
goto ErrorOuput
)
if not exist "%FileName%" (
echo Error: The file "!FileName!" does not exist.
goto ErrorOuput
)
set "LineNumbers="
for /F "delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /I /L /N /C:"%Search%" "%FileName%" 2^>nul') do set "LineNumbers=!LineNumbers!,%%I"
if "%LineNumbers%" == "" (
echo Info: The string "!Search!" could not be found in "!FileName!"
goto EndBatch
)
rem Remove the comma from begin of list of line numbers.
set "LineNumbers=!LineNumbers:~1!"
echo Found "!Search!" in "!FileName!" on the lines:
echo.
echo %LineNumbers%
goto EndBatch
:ErrorOuput
echo.
echo Usage: %~nx0 "file name" "search string"
:EndBatch
echo.
endlocal
pause
错误检查未完成。仍然会发生错误。例如,第一个参数可以是 *.txt
,这会产生错误的结果,因为 FINDSTR 在这种情况下首先输出文件名,然后是冒号,然后是行号,和一个冒号,而不是像在单个文件上搜索时那样只是行号和冒号。
例如在命令提示符窗口中至少运行一次
findstr /I /L /N /C:"endbatch" "SearchString.bat"
将上述批处理代码存储在当前目录下的文件SearchString.bat
中,以查看此处处理的命令FOR。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call/?
... 解释%~1
和%~2
echo/?
endlocal/?
findstr/?
for/?
goto/?
如果/?
暂停/?
rem/?
设置/?
setlocal/?
另请阅读有关 Using command redirection operators 的 Microsoft 文章2>nul
的解释将 FINDSTR 输出的错误消息重定向到处理 STDERR 到设备 NUL 到如果在搜索文件中找不到搜索到的字符串,则取消它。重定向运算符 >
必须在此处使用 ^
进行转义,以便在执行 FINDSTR 时应用重定向,而不是解释 2>nul
作为命令 FOR 在命令行中无效位置的重定向。
关于string - 如何将包含特定字符串的行的行号存储在环境变量中的文本文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39193074/