Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Помогите оптимизировать batnik

Ответить
Настройки темы
CMD/BAT - Помогите оптимизировать batnik

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
@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

Отправлено: 01:35, 22-07-2015

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:29, 22-07-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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%
»
Когда выполняю данный код, то обрабатывается первая строка, а нужна восьмая.

Отправлено: 10:08, 22-07-2015 | #3


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:11, 22-07-2015 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:06, 22-07-2015 | #5


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Iska, лучше сбрасывать предыдущие значения переменной sVar:


Код: Выделить весь код
<"%sSourceFile%" (for /l %%i in (1 1 8) do set sVar=& set/p sVar=)

if defined sVar echo !sVar!

.




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

Отправлено: 16:01, 22-07-2015 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:22, 22-07-2015 | #7


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:12, 23-07-2015 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Помогите оптимизировать batnik

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MySQL - Помогите оптимизировать запросы! evpu Программирование и базы данных 19 14-09-2015 15:34
VBS/WSH/JS - Помогите оптимизировать nasedkin Скриптовые языки администрирования Windows 2 22-06-2015 16:52
CMD/BAT - помогите оптимизировать скрипт dredre Скриптовые языки администрирования Windows 1 18-09-2011 05:10
помогите оптимизировать систему BABA ZINA Выбор отдельных компонентов компьютера и конфигурации в целом 6 07-01-2011 22:19
CMD/BAT - Помогите оптимизировать код n4! Скриптовые языки администрирования Windows 3 08-04-2008 05:59




 
Переход