Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Интерпретируемые языки _ цикл в bat-файле

Автор: Litkevich Yuriy 17.4.2008, 12:56

нужно сделать цикл в bat-файле, чтобы выполнять однотипные действия над каждым файлом из заданного каталога, как это сделать?

Автор: ViGOur 17.4.2008, 12:57

Что именно за действия и формат файла?

Автор: ViGOur 17.4.2008, 13:07

Как вариант:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    would parse each line in myfile.txt, ignoring lines that begin with
    a semicolon, passing the 2nd and 3rd token from each line to the for
    body, with tokens delimited by commas and/or spaces.  Notice the for
    body statements reference %i to get the 2nd token, %j to get the
    3rd token, and %k to get all remaining tokens after the 3rd.  For
    file names that contain spaces, you need to quote the filenames with
    double quotes.  In order to use double quotes in this manner, you also
    need to use the usebackq option, otherwise the double quotes will be
    interpreted as defining a literal string to parse.

    %i is explicitly declared in the for statement and the %j and %k
    are implicitly declared via the tokens= option.  You can specify up
    to 26 tokens via the tokens= line, provided it does not cause an
    attempt to declare a variable higher than the letter 'z' or 'Z'.
    Remember, FOR variables are single-letter, case sensitive, global,
    and you can't have more than 52 total active at any one time.

    You can also use the FOR /F parsing logic on an immediate string, by
    making the filenameset between the parenthesis a quoted string,
    using single quote characters.  It will be treated as a single line
    of input from a file and parsed.

    Finally, you can use the FOR /F command to parse the output of a
    command.  You do this by making the filenameset between the
    parenthesis a back quoted string.  It will be treated as a command
    line, which is passed to a child CMD.EXE and the output is captured
    into memory and parsed as if it was a file.  So the following
    example:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    would enumerate the environment variable names in the current
    environment.

Автор: Tonal 17.4.2008, 13:30

Я уже давно вместь bat-файлов python-ом пользуюсь. :)

Автор: Litkevich Yuriy 17.4.2008, 13:35

Цитата
Что именно за действия и формат файла?

в качестве действия, любая программа с параметром в виде имени файла, хотелось бы знать как его, имя, получать.
Фрмат любой, но проверять буду на текстовом, что-нибудь типа:
cat a1.txt b1.txt 1>>c1.txt

есть еще вопрос:
в приведенном примере вывод идет из "стандартного вывода" в файл, а как сделать чтоб и в файл и в консоль.

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

Автор: Litkevich Yuriy 17.4.2008, 13:38

2 Tonal, а у меня есть пайтон, только времени изучать немогу выкраить.
Можно еще перлов поставить, там как раз с текстом работать. только я как его синтакис увижу, меня колбасить начинает :)

Автор: ViGOur 17.4.2008, 15:25

Имя получаешь с помощь внутренних переменных сред: %1, например, есть у тебя батник с такой записью:

Цитата
echo test: %1 %2 %3
Если ты его запустишь с параметрами a1.txt b1.txt 1, то получишь:
Цитата
test: a1.txt b1.txt 1

Автор: Andrew Selivanov 17.4.2008, 16:13

Ну например вот так я закачиваю файлики на FTP (два батника, первый вызывает второй и передает ему имя текущего файлика как %1)

--- director.bat ---

:forever
forfiles /P D:\shared\ /M *.txt /S /C "cmd /k sender.bat @path"
rem @ping 127.0.0.1 -n 2 -w 1000 > nul
@sleep -m 2000
@goto forever


--- sender.bat ---
curl --url ftp://127.0.0.1 --upload-file %1 -u ftpuser:anonymous
@del %1
exit

Автор: Litkevich Yuriy 17.4.2008, 16:50

что означает @ в bat'нике?

Автор: Andrew Selivanov 17.4.2008, 17:03

Цитата(Litkevich Yuriy @ 17.4.2008, 17:50) *
что означает @ в bat'нике?

Отключить вывод на экран

Автор: Litkevich Yuriy 17.4.2008, 17:05

т.е. если веня вывод вообще не интерисует, то я могу написать echo off в самом начале, и не ставить эти собачки, я правильно понял?

Автор: Andrew Selivanov 17.4.2008, 17:16

Цитата(Litkevich Yuriy @ 17.4.2008, 18:05) *
т.е. если веня вывод вообще не интерисует, то я могу написать echo off в самом начале, и не ставить эти собачки, я правильно понял?

ага именно так, причем ты можешь написать @echo off, чтобы и этой команды тоже не видеть :)

Автор: Litkevich Yuriy 17.4.2008, 18:13

всем спаисбо, завтра, на свежую голову, пойду осваивать UNIX в Виндовозе :D

Автор: Tonal 17.4.2008, 18:27

В python-е обычно проще чем в bat-нике получается. :)

Ну а help есть в винде встроенный - "Справка и поддержка" - там всё доступно описано, разве что примеров маловато. :)
Ну и комманда help в командной строке работает.

Автор: Litkevich Yuriy 17.4.2008, 18:40

у меня справка не откликается на слово FOR :(

Автор: ViGOur 18.4.2008, 7:47

У меня тоже, но зато откликается на for /? :)

Автор: Litkevich Yuriy 18.4.2008, 7:48

да это я по утру нашел :)

Автор: Tonal 18.4.2008, 8:27

Раздел "Справочник по параметрам командной строки" в поиске на него находятся 2 ссылки, переходим по любой и запоминаем в избранном. :-)

Автор: Andrew Selivanov 18.4.2008, 9:34

Цитата(Tonal @ 17.4.2008, 19:27) *
В python-е обычно проще чем в bat-нике получается. :)

Ну а help есть в винде встроенный - "Справка и поддержка" - там всё доступно описано, разве что примеров маловато. :)
Ну и комманда help в командной строке работает.


Ясное дело проще, а в перле еще проще ;) но это не повод уходить от истоков :-D

Автор: Tonal 18.4.2008, 10:10

Про Python vs Perl можно поспорить, ну а истоки - всё таки скорее sh чем cmd. ;-)

Автор: Lunatic 14.6.2009, 6:52

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

..\stats.pl --version

echo.

..\stats.pl -verbose

echo.

Автор: Kagami 14.6.2009, 8:10

Пишем батник:

Раскрывающийся текст
@echo off
:LOOP
..\stats.pl --version
echo.
..\stats.pl -verbose
echo.
sleep 3600000
goto LOOP


Правда sleep.exe придется делать самому. Вот моя версия:
Раскрывающийся текст
#include <windows.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        printf("Usage is \"sleep.exe mseconds\"\n");
        return 0;
    }
    long int mseconds = atoi(argv[1]);
    if (!mseconds) {
        printf("Usage is \"sleep.exe mseconds\"\n");
        return 0;
    }
    Sleep(mseconds);
    return 0;
}

Единственное, не уверен какой тип аргумента внутри sleep... Если int, то внутри батника придется делать цикл что бы вызывать sleep.exe несколько раз с меньшим значением.

Автор: panter_dsd 14.6.2009, 10:42

Можно взять sleep.exe из msys.

Автор: Lunatic 14.6.2009, 16:19

Kagami, спасибо большое :) написал, откомпилил в вижаке :) все работает :)

Автор: Kagami 14.6.2009, 17:44

Цитата(panter_dsd @ 14.6.2009, 11:42) *
Можно взять sleep.exe из msys.

Я не ищу в жизни легких путей :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)