2009-05-01 3 views
2

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

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

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

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

ответ

-1

Я предполагаю, что Вы должны это сделать в чистом Баш.

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

+0

Я проверил несколько тестов, этот скрипт (с удаленным «echo») выполняет 3500 раз/с на моем ящике, 22000 раз/с при загрузке файла выполняется только один раз. С нетерпением ждем других решений с головой, хвостом, вырезом и кошкой;) –

+0

Это выглядит как отличный ответ bash, но я думаю, что он может быть в Windows. См. Теги batch и cmd. – Andy

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

Вы можете увидеть, где я поставил дополнительные эхо-сигналы в тоже увидеть значение переменной и я получаю предыдущий скриншот. Почему это работает для вас, а не для меня? thats not fair lol Я запускаю Vista Home Basic SP1 32-bit

+0

. '' Echo% LINES% 'внутри цикла' for' вычисляются до выполнения команды 'for', поэтому всегда будет отображаться нуль. Чтобы увидеть, увеличивается ли LINKS, используйте задержку расширения; 'echo! LINES!'. Кроме этого, ваш сценарий работает для меня. У меня нет доступа к системе Vista, но я запустил ее на Windows 7 и посмотрю, что произойдет. –

+0

Обе скрипты работают для меня на Windows 7. См. Мой новый ответ для другого возможного решения. –

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% 

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

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 манжета: вы можете столкнуться с проблемами поиска целой строки без /с: «..» часть. Возможно, это часть проблемы, но тогда, возможно, мой сценарий даст те же результаты/проблемы ... Живи и узнай, я думаю.

______Notes__________
набор файлов =: Установите в файл (и путь, в случае необходимости) из файла, подлежащего проверке.
call: grep "string": Вызов функции grep со строкой для поиска.
var =% grep%: Задайте переменную (здесь файлы и размер) для ответа от: grep.

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

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