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

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

Автор: Open999
Дата сообщения: 18.08.2006 11:57

Цитата:
Если не критично расположение файлов именно в этой папке, делай следующее Копируй файл в нужный каталог А затем перемещай файл из IN в IN\Parsed

Расположение файлов именно в этой папки - критично! так мысль мне тоже пришла сразу в голову, но до конца дня эти файлы должны все лежать в этой папке.
Автор: Kirillhome
Дата сообщения: 18.08.2006 12:06
GreaseOD
Боюсь, что силами bat-файла замену строк (части строк) в произвольном текстовом файле через bat-файл сделать проблематично - есть специфичные символы (например, кавычка "), при наличии которых в строке могут быть проблемы.
Автор: KapralBel
Дата сообщения: 18.08.2006 12:23
Open999
Тогда делай следующее
для каждого файла, например 123.txt - создавай скрытый файл 123.txt.old - и по его наличию проверяй, копировался ли этот файл

Либо просто копируй всю папку, XCOPY D:\In\*.* D:\In_1 /D
Автор: anvarga
Дата сообщения: 18.08.2006 12:35
И еще маленький вопросик: Как очистить папку с подкаталогами и файлами, чтобы она осталось пустая?

А с корзиной нет уж все и просто..
Автор: Kirillhome
Дата сообщения: 18.08.2006 12:43
Open999
Если не рассматривать возможность изменения файлов, то новые, к примеру, можно копировать таким образом:


Код:
@echo off
if exist tek.txt del /q tek.txt
if exist ok.tmp del /q ok.tmp
if not exist copy.txt echo > copy.txt
for %%f in (*.*) do echo %%f >> tek.txt

for /f "delims=" %%s in (tek.txt) do call :sss "%%s"
goto:eof

:sss
set str_pois=%~1%
if not %str_pois%==copy.txt (
if not %str_pois%==tek.txt (
find /c "%str_pois%" copy.txt | find /c ": 0" > f.tmp
for /f %%i in (f.tmp) do if %%i==0 echo ok > ok.tmp
del /q f.tmp
if not exist ok.tmp (
copy "%str_pois%" D:\temp\tekst2\"%str_pois%" > nul
echo %str_pois% >> copy.txt)
if exist ok.tmp del /q ok.tmp
)
)
Автор: anvarga
Дата сообщения: 18.08.2006 13:25
Пожалуйста, только один вопрос

Поиск и удаление каталога на одном диске. Имя диска и католага в самом бат явно.

Автор: Open999
Дата сообщения: 18.08.2006 13:40
Копировать всю папку нельзя. В каталоге назначения должны быть только новые файлы, т.к. они попадают на вход обработчика.

2 Kirillhome - спасибо, очень помогло!
Автор: Kirillhome
Дата сообщения: 18.08.2006 13:43
anvarga
if exist D:\Temp\DATE rmdir /q /S D:\Temp\DATE
Автор: ViSiToR
Дата сообщения: 19.08.2006 03:56
Kirillhome

Цитата:
Я, похоже, решил (не красиво, но.. - решил) перекодировку в UTF-8

Большое спасибо... мне когда на мыло пришло сообщение с этим постом (в котором ты привёл батник), то я слегка испугался, насколько страшным может выглядеть батник ... Думаю этот батник, как минимум заслуживает помещения в шапку

anvarga

Цитата:
Как очистить папку с подкаталогами и файлами, чтобы она осталось пустая?



Код: rem Удалить всю папку...
chcp 1251
rmdir /q /s "Путь\к папке"

rem А потом создать в этом же месте папку с таким-же именем...
md "Путь\к папке"
Автор: ViSiToR
Дата сообщения: 19.08.2006 18:26
Скажите, а можно ли батником, проверить существование файла по ссылке? Например, есть такая ссылка [no]http://ссылка.zip[/no], и нужно проверить, существует ли файл по этой ссылке - т.е другими словами, осуществить проверку на то, является ли ссылка битой, или нет. Реально на батниках?
Автор: art569
Дата сообщения: 19.08.2006 21:50
Предлагаю такой способ.
Скачиваем программу curl портированую под Windows.
Дальше пишем батник
Код: curl.exe --head -s http://ссылка.zip |findstr "HTTP.*200.*"
if not errorlevel 1 echo Файл существует
Автор: ViSiToR
Дата сообщения: 20.08.2006 11:38
art569
Большое сенкс... но дело в том, что мне она не совсем подходит, эта утилита относительно много весит...

Может есть способ средствами одного лиш батника?
Автор: art569
Дата сообщения: 20.08.2006 12:23

Цитата:
Большое сенкс... но дело в том, что мне она не совсем подходит, эта утилита относительно много весит...

Эту утилиту можно сжать до 156672 с помощью UPX.

На мой взгдяд решить эту задачу только средствами батника нельзя.
Автор: evle
Дата сообщения: 20.08.2006 13:26
ViSiToR

Цитата:
Может есть способ средствами одного лиш батника?

Средства батников в чистом виде весьма ограничены. Полный список стандартных комманд можно получить во встроенной справке (hh ntcmds.chm). И то, большая часть там - внешние утилиты, включённые в стандартную поставку.
Почти все возможности батников заключаются в получении данных от одной утилиты или из файла и отправке их другой утилите. Грамотно совмещая внешние программы, можно получить красивое, быстрое и удобное решение.
Ничего для работы с http в стандартный набор не входит, значит нужна утилита.
В теории можно попробовать работать через telnet, вручную отправляя нужные команды и обрабатывая результат. Однако практической пользы от такого решения я не вижу: экономя 260 Кб (даже меньше), получим нечто очень длинное, запутанное и, вероятно, привязанное к ОС. При этом придётся ещё помучаться долго с написанием батника.
Автор: Smitis
Дата сообщения: 20.08.2006 13:45
ViSiToR

Цитата:
И ещё, где можно посмотреть такого рода ключи как в команде for (~x, ~n и т.д), только для обычных команд (например, для использования в переменных, как с отбором символов - %Переменная:~-1%) ?

Нигде. Такие "ключи" работают только с переменными команды for и с параметрами, переданными через командную строку или подпрограмме, т.е. %1 %2 %3 и т.д. Как вариант, использовать в командном файле подпрограммы, передавя им значения переменных.
Автор: ViSiToR
Дата сообщения: 20.08.2006 14:06
Smitis


Цитата:
Нигде. Такие "ключи" работают только с переменными команды for

Те ключи которые я привё в пример, да. Но я имел в виду, похожие ключи на эти...

А на счёт моего вопроса:


Цитата:
Есть такой вопрос - Как в Win98, показать на экран последние символы переменной без путей?
Т.е, вот например в WinXP, чтобы осуществить такое, нужно прописать команду так:


Код: For %%a in ("%userprofile%") do echo %%~na
pause


Т.е в данном случае, вывод на экран мы получим имя юзера...

Вот хетолось точно также, только не используя команду for (ведь на сколько мне известно, она в Win98 не работает) - реально такое?
Автор: Smitis
Дата сообщения: 20.08.2006 14:27
ViSiToR

Цитата:
Те ключи которые я привё в пример, да. Но я имел в виду, похожие ключи на эти...

Полистай тему немного назад.
http://forum.ru-board.com/topic.cgi?forum=62&topic=6156&start=1180#15

А для вынь98 используй 4DOS (я на 98 ставил его даже в качестве дефолтного коммандного процессора, всё хорошо работало, правда, были нюансы...)

anvarga

Цитата:
И еще маленький вопросик: Как очистить папку с подкаталогами и файлами, чтобы она осталось пустая?

Предлагаю такой вариант

Код:
pushd folder
rmdir /s/q . 2> nul
popd
Автор: ViSiToR
Дата сообщения: 20.08.2006 14:54
Smitis

Цитата:
А для вынь98 используй 4DOS


Я немного не так вырозился - у меня не стоит вин98, мне просто нужно обойти команду for... чтобы батник работал и в вин 98 - ведь как я понимаю, 4DOS это что-то что ставится на вин98?
Автор: Smitis
Дата сообщения: 20.08.2006 19:06
ViSiToR
4DOS - это альтернативный коммандный процессор сторонней фирмы (бесплатный). Будет работать и на XP и т.п. (но для хр есть платный 4NT для замены CMD.EXE). Но, естественно требует установки (хотя установка может ограничится простым копированием нужных файлов). Без сторонних средств ограничения COMMAND.COM не обойти.

П.С.
Добавил к своему посту грозное предупреждение

Командный процессор имеет весьма ограниченные возможности по обработкzе содержимого текстовых файлов. Все его средства ореентированы в первую очередь на обработку различных системных текстовых файлов (например логов) с чёткой и простой структурой строк. На ПРОИЗВОЛЬНЫХ текстовых файлах, содержащих специальные символы (те же кавычки, например) процессор легко обламается. Могут возникнуть проблемы и с национальными кодовыми таблицами.
И это всё только для линейки NT - NT4, 2000, XP, 2003... (NT4 с ограничениями). Командный процессор для Windows9x/ME не имеет даже этих возможностей.

Автор: xitsa
Дата сообщения: 20.08.2006 19:25
GreaseOD
Для работ с текстом средства лучше, чем sed не найти.
И задачи типа "заменить это на это" на нем решаются элементарно.
Точнее сформулируй задачу—подскажу как ее решить.
Автор: ViSiToR
Дата сообщения: 20.08.2006 23:56
art569


Цитата:
Дальше пишем батник


Не работатт, т.е не со всеми ссылками... вот например, как иронично бы это не звучало, но со ссылкой на эту утилиту (curl.exe), есть проблемы. Привожу пример:


Код: @echo off
curl.exe --head -s http://www.paehl.com/open_source/?download=curl_715_4.zip |findstr "HTTP.*200.*"
if errorlevel 1 (echo file not exists) else echo file exists
pause
Автор: Refugee
Дата сообщения: 21.08.2006 00:17
ViSiToR
Это у них "404 страница" с 200 кодом. Такое не лечится.
Кстати, надо еще добавлять --L для обработки 30x кодов - например, ссылки из "Главные новости IT" из шапки.
Автор: art569
Дата сообщения: 21.08.2006 01:40
Тогда можно добавить проверку Content-Type. Если text/html значит ошибка.


Код:
@echo off
curl.exe -i --head -D log http://www.paehl.com/open_source/?download=curl_715_4.zip >nul
if errorlevel 1 (
    echo Ошибка завершения программы CURL
    goto eof)

findstr "HTTP.*200.*" log >nul
if not errorlevel 1 (goto check_len) else (Echo Не совпадение кода HTTP)
goto EOF

:EOF
del /q log. >nul
exit

:check_len
findstr "Content-Type:.text/html" log >nul
if not errorlevel 1 (echo Не совпадение Content-Type) else (echo OK)
goto EOF
Автор: isem
Дата сообщения: 21.08.2006 09:02
xitsa
Есть текстовый файл. Из него нало удалить строки 2-253 например. Как ето можно сделать?
Спасибо
Автор: GreaseOD
Дата сообщения: 21.08.2006 11:17
xitsa

Цитата:
GreaseOD
Для работ с текстом средства лучше, чем sed не найти.
И задачи типа "заменить это на это" на нем решаются элементарно.
Точнее сформулируй задачу—подскажу как ее решить.


Смысл в следующем:
Есть файлы *.sql в них есть строчка
transdate in ('200601')
Нужно поменять эту дату на например сегодняшнюю !!!
Таких файлов аж 25 шт.
Было бы неплохо одним махом заменить эту дату на сегодняшнюю во всех файлах
а также в одном из этих файлах есть такая срока
transdate in ('200507','200508','200509','200510','200511','200512','200601','200602','200603','200604','200605','200606')
В следующий месяц нужно будет все сместить на один месяц вперед т.е был 200507 - надо будет поменять на 200508 и так все 12 чисел
Таких файлов 8
Вот и постигла меня мысть все это автоматизировать
Автор: anvarga
Дата сообщения: 21.08.2006 11:49
Спасибо! Только немного не так получаеца!

Нужно найти на диске С каталог, например с именем "А1" и удалить его, то есть нужен поиск по всему диску.
Автор: Kirillhome
Дата сообщения: 21.08.2006 13:04
anvarga
Ну так надо правильно задачу ставить

Можно попробовать вот так:

Код:
@echo off
rem Определяем, где ищем
set Path_poisk="D:\TEMP"

rem Определяем, что ищем
set Dir_udal="Tekst"

FOR /R %Path_poisk% %%i IN (.) DO call :my_prv "%%~fi" "%%~nxi"
goto:eof
:my_prv
set str_pois=%2
if %str_pois%==%Dir_udal% goto :naid
goto :ne_naid
:naid
rmdir /s /q %1
:ne_naid
Автор: ViSiToR
Дата сообщения: 21.08.2006 13:05
anvarga

Цитата:
нужен поиск по всему диску.

По идее, для этого можно использовать такую команду:


Код: c:
for /r %%a in (A1) do if exist "%%a" rmdir /q /s "%%a"
Автор: Zvyagel
Дата сообщения: 21.08.2006 16:21
Нужна помощь! Мне нужен батник с помощью которого запускалась бы прога от определенного пользователя и его пароля плюс с указанием домена!
Автор: FXPELIVE
Дата сообщения: 21.08.2006 16:50
ВСЕМ!!!
Помогите написать пакетник, который находит и заменяет или добавляет строчки в определённый файл.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Вернуть библиотеку АТМ (поддержка шрифтов Type 1)


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