Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 3

Автор: Tipulatoid
Дата сообщения: 28.04.2007 16:45
JohnRD

Цитата:
необходимо из первого списка удалить всех кто есть во 2ом

Ну если без стронних утилит, то так. Скорость не обещаю:

Код: @echo off
for /f "tokens=*" %%a in (list1.txt) do (
find "%%a" list2.txt > nul & if errorlevel 1 echo %%a >> list3.txt
)
Автор: JohnRD
Дата сообщения: 28.04.2007 16:54
igor_andreev
супер утилита, в начале я подумал что ошибка а она уже все сделала..
спасибо большое


Tipulatoid
запускаю в среду отпишу результат.

спасибо Всем
Автор: Elroir
Дата сообщения: 28.04.2007 17:12
Tipulatoid

Цитата:
Скорость не обещаю

Код 10 минут работал на файлах с 6000 и 2000 строк. Тот, который я написал (я его не стал выкладывать) - примерно столько же. Так что лучше пользоваться спец. утилитами, как предложил igor_andreev.


Добавлено:
NIKZZZZ

Цитата:
Да, судя по второму примеру среду создает конвейер. Сразу же возникает вопрос, а можно ли определить глобальную переменную?

Насколько я понимаю - нет.
Автор: yurkesha
Дата сообщения: 28.04.2007 18:35
Уважаемый igor_andreev к сожалению в данной ситуации некорректно переформулировал задачу - в исходных условиях нет упоминания о том что все записи первого списка уникальны...
Поэтому код уважаемого Tipulatoid предпочтительнее в общей ситуации...

Автор: igor_andreev
Дата сообщения: 28.04.2007 19:12

Цитата:
в исходных условиях нет упоминания о том что все записи первого списка уникальны

Если бы они были не уникальны - у JohnRD было бы еще одно условие, по которому нужно различать в списке с 4500 ФИО двух разных людей, у которых ФИО совпадает полностью. Адрес там напротив фамилии, или профессия или еще что. Иначе не узнать, какого из двух Абабковых Александров Васильевичей из первого списка(с 4500 строк) нужно удалять, если один Абабков Александр Васильевич есть в во втором списке(с тысячей строк).
Автор: NIKZZZZ
Дата сообщения: 29.04.2007 01:13
Elroir
igor_andreev
Вы все как-то по старинке задачи решаете. Ну, где скажите у вас используются ресурсы комп'ютера, почему большие об'емы современных винтов не используете? Что о вас скажут призводители нового железа? Вот как решать такую задачу надо

Код: echo.>common.bat
copy list1.txt Result.txt
for /f "delims=" %%i in (list2.txt) do (
echo Type result.txt ^| find /v "%%i" ^> "Result_Delete_%%i.txt">"Delete_%%i.bat"
echo copy /y "Result_Delete_%%i.txt" result.txt>>"Delete_%%i.bat"
echo call "Delete_%%i.bat">>common.bat
)
call common.bat
Автор: Elroir
Дата сообщения: 29.04.2007 02:20
NIKZZZZ
Ну замутил!!!
Я даже не сразу сообразил, как этот код работает!
P.S.
Цитата:
Вы все как-то по старинке задачи решаете.

Видно крепко в меня в универе вбили понятия оптимизации и эффективности программ
P.P.S. Кстати, вон у igor_andreev-а батник MATRIX_TT.CMD почти 5 килобайт кода!
Автор: euheny
Дата сообщения: 29.04.2007 03:27
Elroir
NIKZZZZ
igor_andreev
Tipulatoid

А про findstr уже забыли ? - побыстрее и проще будет.
Автор: Elroir
Дата сообщения: 29.04.2007 03:32
euheny
Быстрее и проще, чем предложил igor_andreev?
Я хочу это увидеть! Код в студию!
Автор: igor_andreev
Дата сообщения: 29.04.2007 04:06
Elroir
euheny имеет ввиду подсунуть для findstr файл с тысячей строчек в качестве /g:file и выводить с /v. Я про findstr помню, но она у меня на чем то спотыкалась как-то давно, кажется на файле с очень длинными строчками, поэтому предпочитаю надежности ради ею не пользоваться
Автор: Elroir
Дата сообщения: 29.04.2007 04:14
igor_andreev
Понятно. Честно говоря я не помнил про /g:file .
euheny
Извини, сарказм был неуместен.
Автор: igor_andreev
Дата сообщения: 29.04.2007 04:41
Elroir
Если в /g:file.txt в этом самом file.txt будут строчки длиннее 130 символов или около того, то findstr завыпендривается - "Search string too long". Я про это не знал и findstr.exe меня здорово подвела однажды, посему я на нее обозлился и не пользуюсь

Автор: Elroir
Дата сообщения: 29.04.2007 04:47
igor_andreev
Будем знать .
P.S. А с задачей JohnRD она, действительно, справилась на ура ( я проверил )
Автор: FXPELIVE
Дата сообщения: 29.04.2007 09:27
Возможно-ли средствами командной строки или программами работающими с командной срокой узнать ID компакт-диска?

wolf0425

Цитата:
ping google.com || echo Нет доступа в интернет && goto :eof
wget с нужными параметрами

или у тебя с ключиками к wget затык?


А что значит || echo Нет доступа в интернет && goto :eof?
А можно написать код попроще?
Автор: Maza Faka
Дата сообщения: 29.04.2007 10:53
FXPELIVE

Цитата:
А что значит || echo Нет доступа в интернет && goto :eof?


Символ "||" означает, что следующая за этим символом команда выполняется, если предыдущая команда завершилась с ошибкой.

Символ "&&" означает, что следующая за этим символом команда выполняется, если предыдущая команда завершилась без ошибки.


Цитата:
А можно написать код попроще?

Так ведь проще использовать эти символы, чем раздувать код применяя операторы условия и переходов

P.S. В шапке много ссылок на информацию по командным файлам...


Добавлено:
JohnRD
NIKZZZZ
Elroir

Вот ещё одно решение задачи по сортировке списков:

Код:
@Echo off

Set Skip=1

:_1
Set /a Skip+=1
Set Str=
Set ok=

For /F "Skip=%Skip% Tokens=*" %%a in ('Find /v "" spisok1.txt') do (
If not defined Str Set "Str=%%a")

If not defined Str Goto End

For /f "tokens=*" %%b in (spisok2.txt) do (
If "%%b"=="%Str%" Set ok=yes)

If not defined ok Echo %Str%>> Result.txt
Goto _1

:End
Автор: 0Vovan0
Дата сообщения: 29.04.2007 15:38
А можно ли батником проассоциировать такое-то расширение с такой то программой?
Автор: igor_andreev
Дата сообщения: 29.04.2007 16:06
0Vovan0
ASSOC /?
FTYPE /?
Автор: Maza Faka
Дата сообщения: 29.04.2007 16:56
2 Moderators

Набрёл в сети на ресурс с интересными примерами, ПЛЗ выложите в шапку.
Автор: Elroir
Дата сообщения: 29.04.2007 17:07
Maza Faka
В шапке->Полезные ссылки.
Автор: 0Vovan0
Дата сообщения: 29.04.2007 19:21
igor_andreev
А можно немножко подробней? ато после

Код:
assoc .mp3=Audiofile
ftype AudioFile=mplayer.exe "%1"
Автор: igor_andreev
Дата сообщения: 29.04.2007 19:56
0Vovan0

Цитата:
а проводник педлагает выбрать чем её запускать.

Напиши в ftype полный путь к mplayer.exe

Цитата:
обязательно нужно сначала ему такой-то тип присвоить?

Да. Причем сам можешь придумать, что угодно.

Цитата:
Если с типами - можно допустим AudioFile сделать типом для десятка расширений аудио и после можно сразу всем менять прогу с к-й запускаться будет?

Можно. Запусти например assoc | find /i "txtfile" , увидишь, какие расширения у тебя в OC подпадают под тип txtfile.
Автор: Tipulatoid
Дата сообщения: 30.04.2007 10:14
Кстати, господа, вы мне (гуманитарию, т.е. по-простому можете объяснить, почему код, построенный на внутренних командах cmd.exe работает медленнее кода. построенного на внешних утилитах?
Автор: Maza Faka
Дата сообщения: 30.04.2007 11:06
Tipulatoid

Хм... а как ты замерял скорость и какие именно команды тестил на скорость?
Автор: igor_andreev
Дата сообщения: 30.04.2007 11:46
Maza Faka
У меня были батники с непонятным тугодумием. Я замерял скорость работы ptime.exe (24 Кб) http://www.pc-tools.net/win32/ptime/
ptime команда аргументы
ptime "d:\path\test.cmd"

и потом переписывал код по другому
Автор: Tipulatoid
Дата сообщения: 30.04.2007 13:13
Maza Faka

Цитата:
а как ты замерял скорость и какие именно команды тестил на скорость?

Ну почему, например, такой код

Код: for /f "tokens=*" %%a in (list1.txt) do (
find "%%a" list2.txt > nul & if errorlevel 1 echo %%a >> result.txt
)
Автор: igor_andreev
Дата сообщения: 30.04.2007 13:36
Tipulatoid
Ну это же очевидно - в первом случае команда find запуститься столько раз, сколько строчек в файле list1.txt, да еще if errorlevel столько же раз неслабо быстродействие снижает. find кстати не внутренняя команда, это WINDOWS\system32\find.exe, точно такая же, как и WINDOWS\system32\findstr.exe. Если например в list1.txt две тысячи строк, то в диспетчере задач по Ctrl-Alt-Del find.exe и мелькнет две тысячи раз в списке процессов. Правда каждое мелькание заметить тяжело, но результат - 10 минут работы батника. У меня есть похожий батник, десять тысяч файлов с компа отправляет на флешку, каждый файл пакуя в zip. Ну десять тыщ раз pkzip25.exe и мелькает, нехило нагружая комп. Все руки не доходят переделать
А во втором случае ты запускаешь findstr.exe один раз всего ...
Автор: Tipulatoid
Дата сообщения: 30.04.2007 15:36
igor_andreev
Ясно, спасибо. Думал от чего-то, что find - внутренняя команда
Автор: igor_andreev
Дата сообщения: 30.04.2007 15:51
Я несколько лет назад даже какое-то интервью видел с Б.Гейтсом, оно на английском было, насколько я понял смысл вопроса, там у него что-то типа того и спрашивали, почему отдельные приложения, лежащие в system32 описываются в хэлпе, как внутренние команды cmd.exe. Он кажется как-то вежливо отмазался, типа идите все в ж..., моя винда, что хочу, то и делаю.
Автор: 0Vovan0
Дата сообщения: 01.05.2007 02:06
igor_andreev
спасиб. хотя непонятно почему нельзя проассоциировать посто с mplayer.exe

Такой вот вопрос, почитал инфу в шапке но всетаки запутался, может кто-нибудь привести простой пример цикла в батнике, аналогично

Код: for (i=0; i<n; i++){
if i==10 break;
}
Автор: Elroir
Дата сообщения: 01.05.2007 02:15
0Vovan0

Код:
set n=20
for /l %%a in (1,1,%n%) do (
if %%a==10 goto after_loop
)
:after_loop

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Автозагрузка терминальной сессии


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.