Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Помогите оптимизировать batnik (http://forum.oszone.net/showthread.php?t=302722)

Ingvar2 22-07-2015 01:35 2531173

Помогите оптимизировать 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


Iska 22-07-2015 05:29 2531187

Цитата:

Цитата 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


Ingvar2 22-07-2015 10:08 2531265

Цитата:

Цитата Iska
?! »

поправил описание, в обоих случаях речь идет о восьмой строке.

Цитата:

Цитата 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%

»

Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая.

Georgio 22-07-2015 12:11 2531336

Код:

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

Цитата:

Цитата Ingvar2
Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая. »

Попробуйте выполнять не «данный», а приведённый мною код. Целиком. А не только процитированную часть.

Georgio 22-07-2015 16:01 2531457

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 2531557

Цитата:

Цитата Georgio
Iska, лучше сбрасывать предыдущие значения переменной sVar … Иначе, если искомая (восьмая) строка пуста, »

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

Ingvar2 23-07-2015 12:12 2531750

Спасибо, все получилось


Время: 17:25.

Время: 17:25.
© OSzone.net 2001-