Войти

Показать полную графическую версию : Помогите оптимизировать batnik


Ingvar2
22-07-2015, 01:35
обрый день. Я батники никогда не писал, но по работе пришлось написать. Здесь приложу часть своего батника, который, как мне кажется написан очень не оптимально. Прошу подсказать как его можно оптимизировать.

@echo off
:: имеется файл out.txt с результатом селекта, мне в нем надо оставить только восьмую строчку, к сожалению я так сделать не смог и записал поиск по уникальным данным из восьмой строки с пересохранением строки с найденными данными в тот же файл, но лучше если тут будет жестко прописать оставлять только восьмую строчку
set fname=out.txt
findstr /c:"4 | 1" %fname% >log.tmp
del %fname%
move log.tmp %fname%
:: дальше я начинаю парсить перезаписанный файл out.txt: записываю новый файл xxxx.txt, где xxx равны значениям 8-11 символов единственной строки и записываю в данный файл значения 27го и 37го символов
For /F "Tokens=*" %%A In (out.txt) Do Call :_Func "%%A"
Exit /B 0
:_Func
Set "Str=%~1"
Set "StrNum=%Str:~7,4%"
Set "StrOne=%Str:~26,1%"
Set "StrTwo=%Str:~36,1%"
For /F "Tokens=1 Delims=$" %%A In ("%StrOne%%StrTwo%") Do Echo.%%A>%StrNum%.txt
:: удаляю старый файл
del out.txt
:: проверяю что если в каталоге old отсутствует файл xxxx.txt, то переношу данный файл в этот каталог и записываю результат в лог, а если файл имеется, то только заношу данные в лог
IF not EXIST old\%StrNum%.txt GOTO 1
IF EXIST old\%StrNum%.txt GOTO 2
:1
MOVE %StrNum%.txt old\%StrNum%.txt
echo %StrNum% ok >>log.txt
:: вместо нижеследующей строки по-хорошему, что если в текст в файле = 35 , то должна быть одна запись в лог, а если не равен 35, то другая
echo %StrNum% - %StrOne%%StrTwo% >>log.txt
Exit /B 0
:2
echo %StrNum% fail >>log.txt
Exit /B 0

Iska
22-07-2015, 05:29
оставить только восьмую строчку … из четвертой строки »
?!

Без проверок существования исходного файла и целевого каталога:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=out.txt

<"%sSourceFile%" (
for /l %%i in (1, 1, 7) do >nul set /p sVar=
>nul set /p sVar=
)

set sDestFile=%sVar:~7,4%.txt
set sContent=%sVar:~26,1%%sVar:~36,1%

>"%sDestFile%" echo %sContent%

del "%sSourceFile%"

>>"log.txt" (
if exist "old\%sDestFile%" (
echo [%sDestFile%] fail.
) else (
>nul move "%sDestFile%" "old\%sDestFile%"
echo [%sDestFile%] ok.

if "%sContent%" equ "35" (
echo одна запись в лог
) else (
echo другая
)
)
)

endlocal
exit /b 0

Ingvar2
22-07-2015, 10:08
?! »
поправил описание, в обоих случаях речь идет о восьмой строке.

set sSourceFile=out.txt

<"%sSourceFile%" (
for /l %%i in (1, 1, 7) do >nul set /p sVar=
>nul set /p sVar=
)

set sDestFile=%sVar:~7,4%.txt
set sContent=%sVar:~26,1%%sVar:~36,1%

>"%sDestFile%" echo %sContent%»
Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая.

Georgio
22-07-2015, 12:11
@echo off

set "fname=out.txt"
set "number=8"

for /f "delims=" %%i in ('type "%fname%"^| findstr/n "^"^| findstr/b %number%:^& del "%fname%"') do (
set x=%%i
for /f "delims=" %%j in ('cmd/v/c echo "!x:*:=!"') do (
set x=%%~j
for /f "tokens=1,2 delims=$" %%k in ('cmd/v/c "echo !x:~7,4!$!x:~26,1!!x:~36,1!"') do (
if exist "old\%%k.txt" (
>"%%k.txt" echo.%%l
>>"log.txt" echo %%l fail
) else (
>"old\%%k.txt" echo.%%l
>>"log.txt" (
echo %%k ok
if "%%l" equ "35" (
echo %%k - %%l
) else (
echo Другая запись с "%%k" и "%%l".
)
)
)
)
)
)

exit/b

Iska
22-07-2015, 13:06
Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая. »
Попробуйте выполнять не «данный», а приведённый мною код. Целиком. А не только процитированную часть.

Georgio
22-07-2015, 16:01
Iska, лучше сбрасывать предыдущие значения переменной sVar:


<"%sSourceFile%" (for /l %%i in (1 1 8) do set sVar=& set/p sVar=)

if defined sVar echo !sVar!


.




Иначе, если искомая (восьмая) строка пуста, то значением переменной sVar станет именно предыдущее значение, полученное в результате чтения предыдущей непустой строки.

Iska
22-07-2015, 19:22
Iska, лучше сбрасывать предыдущие значения переменной sVar … Иначе, если искомая (восьмая) строка пуста, »
Угу. Тут я обусловился именно тем, что она не пуста. А вот то, что, в общем-то, нет никакой насущной необходимости как-то отдельно выделять чтение восьмой строки — не сообразил: сразу решил, что надо «пропустить» семь строк и «прочитать» восьмую. Так и осталось :).

Ingvar2
23-07-2015, 12:12
Спасибо, все получилось




© OSzone.net 2001-2012