Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: цикл в bat-файле
Форум на CrossPlatform.RU > Разработка > Интерпретируемые языки
Litkevich Yuriy
нужно сделать цикл в bat-файле, чтобы выполнять однотипные действия над каждым файлом из заданного каталога, как это сделать?
ViGOur
Что именно за действия и формат файла?
ViGOur
Как вариант:
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
Я уже давно вместь bat-файлов python-ом пользуюсь. :)
Litkevich Yuriy
Цитата
Что именно за действия и формат файла?

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

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

---
а гдеб мануал по пакетным файлам виндовоза взять? желательно на руском, по инету полазил - все обрывки без объяснений.
Litkevich Yuriy
2 Tonal, а у меня есть пайтон, только времени изучать немогу выкраить.
Можно еще перлов поставить, там как раз с текстом работать. только я как его синтакис увижу, меня колбасить начинает :)
ViGOur
Имя получаешь с помощь внутренних переменных сред: %1, например, есть у тебя батник с такой записью:
Цитата
echo test: %1 %2 %3
Если ты его запустишь с параметрами a1.txt b1.txt 1, то получишь:
Цитата
test: a1.txt b1.txt 1
Andrew Selivanov
Ну например вот так я закачиваю файлики на 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
что означает @ в bat'нике?
Andrew Selivanov
Цитата(Litkevich Yuriy @ 17.4.2008, 17:50) *
что означает @ в bat'нике?

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

ага именно так, причем ты можешь написать @echo off, чтобы и этой команды тоже не видеть :)
Litkevich Yuriy
всем спаисбо, завтра, на свежую голову, пойду осваивать UNIX в Виндовозе :D
Tonal
В python-е обычно проще чем в bat-нике получается. :)

Ну а help есть в винде встроенный - "Справка и поддержка" - там всё доступно описано, разве что примеров маловато. :)
Ну и комманда help в командной строке работает.
Litkevich Yuriy
у меня справка не откликается на слово FOR :(
ViGOur
У меня тоже, но зато откликается на for /? :)
Litkevich Yuriy
да это я по утру нашел :)
Tonal
Раздел "Справочник по параметрам командной строки" в поиске на него находятся 2 ссылки, переходим по любой и запоминаем в избранном. :-)
Andrew Selivanov
Цитата(Tonal @ 17.4.2008, 19:27) *
В python-е обычно проще чем в bat-нике получается. :)

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


Ясное дело проще, а в перле еще проще ;) но это не повод уходить от истоков :-D
Tonal
Про Python vs Perl можно поспорить, ну а истоки - всё таки скорее sh чем cmd. ;-)
Lunatic
помогите пожалуста :)
нужно сделать чтобы код в батнике выполнялся бесконечно (пока тупо крестик не нажму) с задержкой в час...т.е. я запущу его, сверну в трей и пусть он там работает...(код выполняет обновление статистики на сайте..) заранее спасибо :)

..\stats.pl --version

echo.

..\stats.pl -verbose

echo.
Kagami
Пишем батник:
Раскрывающийся текст
@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
Можно взять sleep.exe из msys.
Lunatic
Kagami, спасибо большое :) написал, откомпилил в вижаке :) все работает :)
Kagami
Цитата(panter_dsd @ 14.6.2009, 11:42) *
Можно взять sleep.exe из msys.

Я не ищу в жизни легких путей :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.