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

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

Автор: Petrofox
Дата сообщения: 14.01.2007 08:03
Там разные расширения, и мне надо все разархивировать в одну папку конкрентную, сделать так?:

@echo off
for %%I in (*.*) do (
:: Следующую строчку нужно подстроить к своей утилите разархивации
unzip %%I -d /C:/имя_папки
)


Добавлено:
@echo off
for %%I in (*.*) do (
:: Следующую строчку я подстроил к своей утилите разархивации
pczipc -extr -dir=current %%I
)

Вот так сделал, но не работает (
Автор: Elroir
Дата сообщения: 14.01.2007 09:59
Petrofox
Попробуй так:

Код: pkzipc.exe -extract %%I current
Автор: Petrofox
Дата сообщения: 14.01.2007 11:26
http://www.macloud.ru/files.html
Архиватор ZIP 4.00, консольный, W32    260kb
Вот он, только да ошибка, первый раз правильно написал pkzipc.exe

Вот пример использования Extract:
pkzipc -extr=up save.zip

Делаю:
pkzipc -extr=current ar1.zip

папка current и архив ar1.zip находятся в папке с pkzipc.exe
но никакго результата (
Автор: Jon_Dow
Дата сообщения: 14.01.2007 12:58
Делаете неправильно. Опции:
-extr=all
-extr=freshen
-extr=update
используются для управления извлечением, а не для указания папки... (Т.е. извлечение всех файлов, только замена существующих в конечной директории файлов с более старой датой, извлеченние более новых и несуществующих в конечной директории)
А вам надо все-таки:
pkzipc -extract ar1.zip current
ЗЫ - результат кстати был: Unknown or illegal sub-option - extr=current
Обращайте внимание на сообщения...

Добавлено: к тому же вы НИ ЕДИНОГО РАЗУ не прочитали внимательно сообщения уважаемого Elroir - что нехорошо - он ведь именно для вас решал вашу проблему...
Автор: Tipulatoid
Дата сообщения: 14.01.2007 18:09

Цитата:
Tipulatoid
Код батника:

Код:

@echo off
setlocal enabledelayedexpansion
set mail_adress=tureth[]yahoo.mm
for /f "delims== tokens=1,2" %%a in (send.ini) do call :create %%a %%b
goto :EOF

:create
set rname=%2
for /f "tokens=*" %%I in (shablon.txt) do echo %%I>>letter_%1.txt
    

shablon.txt:

Код:

Здравствуй, !rname!
Пиши мне на !mail_adress!


Уважаемый Elroir, этот код что вы мне написали, я адаптировал под свою задачу, и он прекрасно работает. Однако осталась большая проблема - код этот у меня стоит где-то в середине батника и команда call, обработав команды метки :create и сделав что от нее требовалось - файлы писем, не останавливается, а идет дальше, обрабатывая команды следующих меток, прогоняя их до конца батника 6 раз (у меня в файле send.ini 6 строк). Этого совсем не нужно. Как указать команде call чтоб обрабатывала команды метки :create и все? Эксперементы с goto :EOF не помогли. Команду endcall в справке Windows не нашел. exit /b просто заканчивает работу батника.
Конечно, данный участок кода можно вынести в отдельный батник - но, имхо, это плохой стиль программирования - плодить батники. Все должен делать один файл. Спасибо.

На всякий случай повторю send.ini


Цитата:
Цитата:
1=Ruslan
2=Semen
3=Andrey
4=Viktor
5=Maxim
6=Slava
Автор: Elroir
Дата сообщения: 14.01.2007 18:24
Tipulatoid
Если я правильно понимaю - проблема должна решиться добавлением одной строчки:

Код:
:create
set rname=%2
for /f "tokens=*" %%I in (shablon.txt) do echo %%I>>letter_%1.txt
goto :EOF
Автор: Tipulatoid
Дата сообщения: 14.01.2007 19:15
Elroir
Экспериментировал я с goto :EOF Не получалось. Куда только не вставлял Или я такой талантливый?
Сообразил сейчас такое решение - данный участок кода с помощью echo выношу в вспомогательный bat-файл, потом запускаю его через call из основного батника, вспомогательный делает письма, затем основной его удаляет.
Автор: Elroir
Дата сообщения: 14.01.2007 20:02
Tipulatoid
Попробуйте поместить блок :create в самый конец батника. Или приведите полный код этого батника - можно в ПМ.
Автор: StanislavG
Дата сообщения: 15.01.2007 08:51
Elroir

Я сделал запуск планировщиком и хочу вести лог я написал так в ланировщике
Цитата:
c:\jour.bat >log_bat\%date~-10%.txt



Добавлено:
Elroir
Я писал
Цитата:
как сделать что-бы по окончанию цикла батника запустился архиватор

Ответ был такой
Цитата:
После первого for-a в батнике, перед командой goto :EOF, вставь строчку запуска архиватора.

У меня все заархивировалось но не с датой создания файлов. посмотри правильно ли я сделал
Цитата:
@echo off
rem start %time%
setlocal
set dt=%date%
FOR %%I IN (*.lo1) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%

c:
cd \test1
arj32 m jour%4.dh0 *.*

goto :EOF

:finddate
for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO call :test %%A %%B %%C %1 %2 %3 %4
goto :EOF

:test
rem File's date
set fd=%1
set fm=%2
set fy=%3
rem Current date
set curd=%5
set curm=%6
set cury=%7
set /a prevd=%curd%-1
set prevm=%curm%
set prevy=%cury%
set prevye=%cury%
if %curm%==12 (set prevme=11& set days=30)
if %curm%==11 (set prevme=10& set days=31)
if %curm%==10 ( set prevme=09& set days=30)
if %curm%==09 ( set prevme=08& set days=31)
if %curm%==08 ( set prevme=07& set days=31)
if %curm%==07 ( set prevme=06& set days=30)
if %curm%==06 ( set prevme=05& set days=31)
if %curm%==05 ( set prevme=04& set days=30)
if %curm%==04 ( set prevme=03& set days=31)
if %curm%==03 ( set prevme=02& set days=28)
if %curm%==02 ( set prevme=01& set days=31)
if %curm%==01 ( set prevme=12& set days=31& set /a prevye=%prevy%-1)
if %prevd% LEQ 0 (
set /a prevd=%days%+%prevd%
set prevm=%prevme%
set prevy=%prevye%)
set match=true
if not "%fd%"=="%prevd%" ( set match=false)
if not "%fm%"=="%prevm%" ( set match=false)
if not "%fy%"=="%prevy%" ( set match=false)
if "%match%"=="true" (copy c:\test\%4 c:\test1\*.*)


Автор: Elroir
Дата сообщения: 15.01.2007 15:26
StanislavG

Цитата:
У меня все заархивировалось но не с датой создания файлов

Используй следующую конструкцию:

Код: arj32 m jour%prevd%%prevm%.dh0 *.*
Автор: StanislavG
Дата сообщения: 15.01.2007 15:43
Elroir
В жэтой строчке указываеться тип файла

Цитата:
FOR %%I IN (*.lo1) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%


А где можно указать каталог из которого он обрабатывает файлы

И еще он чего то повторяет свои действие в чем может быть причина

Автор: Zyava
Дата сообщения: 15.01.2007 16:28

Цитата:
Попробуй так:
START /B /WAIT


Так оно будет запускаться в том же окне и соответственно при вылете/удаление из процессов закрываться вместе с батником - уже пробовал и сейчас специально еще раз убедился .
Автор: StanislavG
Дата сообщения: 15.01.2007 16:37
А проверте батничек


Цитата:
@echo off
start %time%
setlocal
set dt=%date%
FOR %%I IN (*.lo1) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%

cd w:\nbumail\journal
arj32 m w:\nbumail\journal\jour%prevd%%prevm%.dh0 w:\nbumail\journal\ *.*

goto :EOF

:finddate
for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO call :test %%A %%B %%C %1 %2 %3 %4
goto :EOF

:test
rem File's date
set fd=%1
set fm=%2
set fy=%3
rem Current date
set curd=%5
set curm=%6
set cury=%7
set /a prevd=%curd%-1
set prevm=%curm%
set prevy=%cury%
set prevye=%cury%
if %curm%==12 (set prevme=11& set days=30)
if %curm%==11 (set prevme=10& set days=31)
if %curm%==10 ( set prevme=09& set days=30)
if %curm%==09 ( set prevme=08& set days=31)
if %curm%==08 ( set prevme=07& set days=31)
if %curm%==07 ( set prevme=06& set days=30)
if %curm%==06 ( set prevme=05& set days=31)
if %curm%==05 ( set prevme=04& set days=30)
if %curm%==04 ( set prevme=03& set days=31)
if %curm%==03 ( set prevme=02& set days=28)
if %curm%==02 ( set prevme=01& set days=31)
if %curm%==01 ( set prevme=12& set days=31& set /a prevye=%prevy%-1)
if %prevd% LEQ 0 (
set /a prevd=%days%+%prevd%
set prevm=%prevme%
set prevy=%prevye%)
set match=true
if not "%fd%"=="%prevd%" ( set match=false)
if not "%fm%"=="%prevm%" ( set match=false)
if not "%fy%"=="%prevy%" ( set match=false)
if "%match%"=="true" (
copy c:\oss.452\%4 c:\tcpfoss.452\jnin\
copy c:\oss.452\log\%4 c:\tcpfoss.452\jnin\
copy c:\oss.ie\%4 c:\tcpfoss.kie\jnin\
copy c:\oss.ie\key\*.* w:\nbumail\journal
copy c:\oss.ie\log\%4 c:\tcpfoss.kie\jnin\
copy c:\oss.ie\key\*.* w:\nbumail\journal
move c:\oss.452\%4 w:\nbumail\journal
move c:\oss.452\log\%4 w:\nbumail\journal
move c:\oss.ie\%4 w:\nbumail\journal
move c:\oss.ie\log\%4 w:\nbumail\journal
)


Автор: Elroir
Дата сообщения: 15.01.2007 16:55
StanislavG

Цитата:
А где можно указать каталог из которого он обрабатывает файлы

В начале батника определи переменную workdir, перейди в эту директорию, а в конце вернись в ту, в которой был:

Код:
set workdir=c:\temp
pushd %workdir%
...
...
popd
Автор: stalker0
Дата сообщения: 15.01.2007 21:33
Подскажите, пожалуйста:

В Win2000 можно командой (батником) выключить (перезагрузить) ПК?
(команды shutdown тут нет...)
Автор: Nagual
Дата сообщения: 15.01.2007 21:43
stalker0
ну это не команда, а утилита, попроси ее у кого-нибудь, в конце концов не так уж много она весит, и пользуй на здоровье
Автор: Smitis
Дата сообщения: 15.01.2007 22:10
stalker0
Или скачай с SysInternals.com утилиту psshutdown (входит в состав pstools). У неё возможностей больше.
Автор: StanislavG
Дата сообщения: 16.01.2007 06:54
Elroir

Цитата:
Что такое "start %time%"?

Это время начало работы
Автор: regular
Дата сообщения: 16.01.2007 10:12

Цитата:
@echo off
setlocal enabledelayedexpansion
if exist ftemp.txt del /q ftemp.txt
for /f "tokens=*" %%I in (filename.ext) do (
set fname=%%I
echo !fname:~5,-8!>>ftemp.txt
)
del /q filename.ext
ren ftemp.txt filename.ext


Очень понравился это код который написал [/bElroir
[/b].

Нельзя ли его прокоментировать? В частности !fname:~5,-8!
Как эта строка выбирает удаляет первые 5 и последние 8 символов?
Что значит символ "!" ?
Автор: Elroir
Дата сообщения: 16.01.2007 12:56
regular

Цитата:
В частности !fname:~5,-8!
Как эта строка выбирает удаляет первые 5 и последние 8 символов?
Что значит символ "!" ?

Имеем переменную fname, в которую подставляем значение переменной %%I в каждом цикле for-а. В обычном случае, чтобы узнать значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы батника, нужно использовать команду setlocal enabledelayedexpansion и вместо символа "%", использовать символ "!". Иначе, значение переменной в цикле будет всегда одним и тем же - таким, каким было до входа в цикл.
При работе с переменными окружения, чаще всего, мы используем их как строчки. Часто нам нужно выделить из строчки какую-нибудь подстрочку. Для этого можно использовать конструкцию %var:~n% или %var:~n,m%. В первом случае мы получаем подстрочку начиная с n-ого символа и до конца строки, во втором подстрочку начинающуюся с n-ого символа и заканчивающегося символом с номером m. Нумерация ведется с 0. Если число со знаком минус, то отсчет ведется с конца строки. Таким образом !fname:~5,-8! отсчитывает 5 символов с начала строки, которая находится в переменной fname, отсчитывает 8 символов с конца и мы получаем подстрочку fname, ограниченную этими условиями.
Автор: AZJIO
Дата сообщения: 16.01.2007 22:46
Есть у кого нибудь справка по созданию *.bat-файлов, описание готовых задач. Я себе создаю такую справку, но очень медленно, а те, что в шапке для меня не очень то понятны.
Тот скрипт, что я выкладывал - я разобрался, вот:

Цитата:

set /p privod=Выберите букву CD,DVD-привода (D,E,F,G,H,I,J,K,L):
%privod%:\i386\winnt32.exe /cmdcons

А я по началу с метками возился. Был код с выбором Да или Нет, и метки. Я добавил выбор дисков и метки, модернизировав код по своему, а оказалось можно было переменную задать и всё.

Вот этот код
Цитата:
attrib -s -h C:\boot.ini
почему то перестал работать, даже в корне диска без указании пути, хотя раньше работал. Но при этом создаётся boot.ini без атрибутов в той папке, из которой запускаю батник.
Автор: stalker0
Дата сообщения: 16.01.2007 22:59
Nagual
Smitis
Спасибо.
Nagual
Если shutdown - это утилита, то ее можно просто с winXP переписать в 2000-й ?
Автор: regular
Дата сообщения: 17.01.2007 00:16
Elroir, я все понял. Огромное тебе СПАСИБО!
Автор: Maza Faka
Дата сообщения: 17.01.2007 09:20
Как скопировать одновременно несколько файлов, что бы не писать команду copy для каждого файла?
Автор: regular
Дата сообщения: 17.01.2007 10:49
Elroir, хочу еще тебе спросить.
Когда я делаю выполняю иакой скрипт к примеру:

Цитата:

setlocal EnableDelayedExpansion
for /f "tokens=*" %%I in (myfile.txt) do (
set fname=%%I
echo !fname:~0,-6!>>ftemp.txt
)

У меня почему-то в конец каждой строки дописывается пробел. И еще не всегда понятно при каких значениях переменной n в выражении !fname:~m,-n! начинается удаление последних символов. Иногда это происходит при n=2 иногда при n=3... Почему такое происходит?
Автор: ViSiToR
Дата сообщения: 17.01.2007 11:12
Maza Faka


Цитата:
Как скопировать одновременно несколько файлов

Примерно так:


Код:
Set Files=File1.txt File2.txt
For %%a in (%Files%) Do Copy "C:\%%a" "D:\%%a"
Автор: FuZz21
Дата сообщения: 17.01.2007 12:06
Подскажите как задать условие на выполнение, если компьтер пингуется ????


Например

IF (ping 192.168.0.2 = true) \\ т.е. пингуется
THEN DO copy \\ для примера!
Автор: regular
Дата сообщения: 17.01.2007 12:43

Вот ерунда какая у меня:

C:\> del /f /q /s /p X: *.mp3
X:\ANKETA_RF_.pdf.pdf, Delete (Y/N)?

Тоесть скрипт хочет мочить все файлы вместо только *.mp3.

Скрипт я взял тут -> http://www.windowsfaq.ru/content/view/27/45/

И в том виде что он там есть, я его запустил. Представте, что произошло..
Автор: GreaseOD1
Дата сообщения: 17.01.2007 12:51
Подскажите плиз..
Затачка такая:
Есть большой батник который запускается с параментрами file.bat %1 %2 %3 %4
Хочу добавить параметр %5. Но он не всегда будет использовать. В основном используется только четыры параметра.
Нужно сделать проверку %5. Если он не задан, то выполнять как обычно
Что-то типа
if '%5' параметр не задан то .....
Автор: yurkesha
Дата сообщения: 17.01.2007 13:15
regular
Код: FOR /r %%i IN (*.mp3) DO del %%i

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Сбой активации XP sp2


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