我在尝试获取字符串之后遇到问题:在以下两行中将两个独立的变量放在一个名为file.txt的文本文件底部,例如
Number of files to delete: 27 Total
Total size of files to delete: 1,427 KB
我只想在一个变量中使用27,在另一个变量中使用1,427。 这些是从扫描中随机生成的,可能包含更多数字。
请批量文件,我正在使用Windows
答案 0 :(得分:4)
这样的事情应该有效:
@echo off
setlocal enableextensions enabledelayedexpansion
:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in (file.txt) do (
set /a LINES=LINES+1
)
:: Parse the last 2 lines and get the numbers into variable NUMS
set /a LINES=LINES-2
for /f "skip=%LINES% delims=" %%L in (file.txt) do (
for /f "tokens=1-2* delims=:" %%A in ("%%L") do (
for /f "tokens=1-2*" %%N in ("%%B") do set NUMS=!NUMS!%%N;
)
)
:: Parse variable NUMS
for /f "tokens=1-2* delims=;" %%A in ("%NUMS%") do (
set NUM_FILES=%%A
set TOTAL_SIZE=%%B
)
@echo Number of files = %NUM_FILES%
@echo Total size of files = %TOTAL_SIZE%
答案 1 :(得分:1)
<强> delfiles.cmd 强>
@echo off
set file=clean.txt
call :grep "Number of files to delete:"
set files=%grep%
call :grep "Total size of files to delete:"
set size=%grep%
echo %Files% files of a total size of %size% are to be deleted.
exit /b 0
:grep
setlocal
for /F "tokens=2 delims=:" %%i in ('findstr /i /c:"%~1" "%file%"') do (
for /F "tokens=1 delims= " %%j in ("%%i") do set _find=%%j
)
endlocal& set grep=%_find%
exit /b 0
这是一个可重复使用的脚本,因为文件和字符串可以使用相同的结果进行更改。我复制/粘贴了你的例子,它运作良好。
@Patrick Cuff:如果没有 / c:“..”部分找到整个字符串,可能会遇到问题。可能是问题的一部分,但是也许我的脚本会给出相同的结果/问题......我想是生活和学习。
<强> ______备注__________ 强>
set file =:将其设置为要扫描的文件的文件(以及路径,如果需要)。
调用:grep “string”:使用要查找的字符串调用:grep函数。
设置 var =%grep%:将变量(此处为文件和大小)设置为:grep。
:grep函数:它首先在%file%中查找“%string%”,然后在':'字符处解析它,保留右边的部分。然后用'空格'再次解析它并保留第一个单词。该函数返回包含找到的字符串的变量%grep%。
与我通常的答案一样,我希望这会有所帮助。
答案 2 :(得分:0)
这是我的完整批处理文件;
@echo on
setlocal enableextensions enabledelayedexpansion
:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in (D:\clean.txt) do (
set /a LINES=LINES+1
echo %LINES%
)
:: Parse the last 2 lines and get the numbers into variable NUMS
set /a LINES=LINES-2
echo %LINES%
for /f "skip=%LINES% delims=" %%L in (D:\clean.txt) do (
for /f "tokens=1-2* delims=:" %%A in ("%%L") do (
for /f "tokens=1-2*" %%N in ("%%B") do set NUMS=!NUMS!%%N;
)
)
:: Parse variable NUMS
for /f "tokens=1-2* delims=;" %%A in ("%NUMS%") do (
set NUM_FILES=%%A
set TOTAL_SIZE=%%B
)
@echo Number of files = %NUM_FILES%
@echo Total size of files = %TOTAL_SIZE%
你可以看到我把额外的回声放在哪里,也看到了变量的值,我得到了前面的截图。为什么它对你而不是我有用?那不公平哈哈 我正在运行Vista Home Basic SP1 32位
答案 3 :(得分:0)
看起来你在读取整个文件以获得行数方面遇到了一些问题。此解决方案将只找到您感兴趣的字符串并获取值:
@echo off
setlocal enableextensions enabledelayedexpansion
:: Get number of files to delete.
for /f "usebackq tokens=1-7" %%A in (`findstr /b "Number of files to delete:" file.txt`) do (
set NUM_FILES=%%F
)
:: Get total size of files.
for /f "usebackq tokens=1-8" %%A in (`findstr /b "Total size of files to delete:" file.txt`) do (
set TOTAL_SIZE=%%G
)
@echo Number of files = %NUM_FILES%
@echo Total size of files = %TOTAL_SIZE%
如果包含文件数和总大小的字符串发生变化,则必须相应地更改脚本。
答案 4 :(得分:-1)
我认为你需要用纯粹的bash来完成。
#!/bin/bash
S="$(<testfile.txt)" # load the data
A="${S#*:}" # remove everything before the first : (including it)
A="${A%%Total*}" # remove everything after the first "Total" (including it)
B="${S##*:}" # remove everything before the last : (including it)
B="${B% *}" # remove everything after the last space (including it)
A="${A// }" # remove all spaces
B="${B// }"
echo "-$A-" # print results (showing that there are no spaces in it)
echo "-$B-"
我鼓励您探索man bash
的参数扩展部分。你会在那里找到许多有用的技巧。