Пакетный файл - в переменную - PullRequest
2 голосов
/ 01 мая 2009

У меня возникают проблемы при попытке получить строку после: в следующих двух строках в две отдельные переменные в нижней части текстового файла с именем file.txt, например

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

Я просто хочу 27 в одной переменной и 1427 в другой. Они генерируются случайным образом из сканирования и могут содержать больше цифр.

Пакетный файл, пожалуйста, я использую Windows

Ответы [ 5 ]

4 голосов
/ 01 мая 2009

Примерно так должно работать:

@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 голос
/ 26 августа 2009

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 "строка" : Вызов функции: grep со строкой для поиска.
set var =% grep%: Установить переменную (здесь файлы и размер) для ответа от: grep.

: функция grep: Сначала он ищет в% file% «% string%», а затем анализирует его по символу «:», сохраняя правую часть. Затем он снова разбирает его с помощью «пробелов» и сохраняет первое слово. Функция возвращает переменную% grep%, которая содержит найденную строку.

Как и в случае с моими обычными ответами, я надеюсь, что это поможет.

0 голосов
/ 05 мая 2009

Похоже, у вас возникли проблемы с чтением всего файла для получения количества строк. Это решение найдет только интересующие вас строки и получит значения:

@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%

Если строки с количеством файлов и общим размером когда-либо изменятся, вам придется соответствующим образом изменить сценарий.

0 голосов
/ 05 мая 2009

Это мой полный пакетный файл;

@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-разрядная

0 голосов
/ 01 мая 2009

Полагаю, вам нужно сделать это в чистом виде.

#!/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. Там вы найдете множество полезных трюков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...