 |
|
Помогите оптимизировать batnik
обрый день. Я батники никогда не писал, но по работе пришлось написать. Здесь приложу часть своего батника, который, как мне кажется написан очень не оптимально. Прошу подсказать как его можно оптимизировать.
Код:
@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
|
Цитата:
Цитата Ingvar2
оставить только восьмую строчку … из четвертой строки »
|
?!
Без проверок существования исходного файла и целевого каталога:
Код:
@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
|
поправил описание, в обоих случаях речь идет о восьмой строке.
Цитата:
Цитата Iska
Код:
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%
»
|
Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая.
|
Код:
@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
|
Цитата:
Цитата Ingvar2
Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая. »
|
Попробуйте выполнять не «данный», а приведённый мною код. Целиком. А не только процитированную часть.
|
Iska, лучше сбрасывать предыдущие значения переменной sVar:
Код:
<"%sSourceFile%" (for /l %%i in (1 1 8) do set sVar=& set/p sVar=)
if defined sVar echo !sVar!
.
Иначе, если искомая (восьмая) строка пуста, то значением переменной sVar станет именно предыдущее значение, полученное в результате чтения предыдущей непустой строки.
|
Цитата:
Цитата Georgio
Iska, лучше сбрасывать предыдущие значения переменной sVar … Иначе, если искомая (восьмая) строка пуста, »
|
Угу. Тут я обусловился именно тем, что она не пуста. А вот то, что, в общем-то, нет никакой насущной необходимости как-то отдельно выделять чтение восьмой строки — не сообразил: сразу решил, что надо «пропустить» семь строк и «прочитать» восьмую. Так и осталось :).
|
Время: 17:25.
© OSzone.net 2001-