批处理文件 - 变量

时间:2009-05-01 00:53:44

标签: scripting batch-file variables cmd

我在尝试获取字符串之后遇到问题:在以下两行中将两个独立的变量放在一个名为file.txt的文本文件底部,例如

Number of files to delete:  27 Total
Total size of files to delete: 1,427 KB

我只想在一个变量中使用27,在另一个变量中使用1,427。 这些是从扫描中随机生成的,可能包含更多数字。

请批量文件,我正在使用Windows

5 个答案:

答案 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)

jimbob,这是我想出的:

<强> 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参数扩展部分。你会在那里找到许多有用的技巧。