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

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

Автор: res2001
Дата сообщения: 18.01.2011 13:34
res2001
Дык мой вариант удаляет только каталоги, файлы не трогает.
Автор: inock
Дата сообщения: 18.01.2011 13:35
Скажите, можно ли в bat реализовать алгоритм, который на VB выглядел бы примерно так:

Dim ID, sURL, STEPS
ID=301987
STEPS= 100
sURL="http://vegacomp.ru/index.php?productID="

For i=ID To ID+STEPS
WScript.Echo(sURL & i)
Next


И еще, можно как-то заэкранировать двойные кавычки в команде

find /i "id="zhead""
Автор: user5nov
Дата сообщения: 18.01.2011 13:40
Чтобы не путать напишу что нужно от скрипта.
1. Удалял папки и файлы, но оставлял ярлыки (ссылки на файлы)
for /R "%UserProfile%\Рабочий стол" %%i in (*.*) do if not %%~xi==.lnk del /F /Q "%%~fi"
этот батник отрабаывает но оставляет, папки.
может совместить их?

clear desktop.bat
for /R "%UserProfile%\Рабочий стол" %%i in (*.*) do if not %%~xi==.lnk del /F /Q "%%~fi"
for /f "tokens=*" %%i in ('dir /b /A:D "%UserProfile%\Рабочий стол" ') do echo rd /s/q "%UserProfile%\Рабочий стол\%%i"

после выполнения, папки остаются, видимо вторая строчка не отрабатывает.

Добавлено:
res2001
Сорри, ошибка моя, всё работает, спасибо большое
Автор: res2001
Дата сообщения: 18.01.2011 14:05
inock

Цитата:
И еще, можно как-то заэкранировать двойные кавычки в команде

find /i "id=""zhead"""

Цитата:
Скажите, можно ли в bat реализовать алгоритм, который на VB выглядел бы примерно так:


Код: @echo off
set ID=301987
set STEPS=100
set sURL="http://vegacomp.ru/index.php?productID="
set /a "count=ID+STEPS"
For /l %%i in (%ID%,1,%count%) do Echo.sURL%%i
Автор: inock
Дата сообщения: 18.01.2011 14:26
Спасибо.
С первого раза не заработало... Вопрос: вот в этой части:


Код:
For /l %%i in (%ID%,1,%count%) do (
rem Echo %sURL%%%i

C:\unixutils\wbin\wget.exe "%sURL%%%i" -Ofile.html

find /i "id=""zhead""" file.html

if errorlevel 0 goto end

echo %sURL%%%i >> result.txt

:end
)
Автор: res2001
Дата сообщения: 18.01.2011 14:46
inock
На сколько я понимаю, если поиск закончился не удачно, то выводишь УРЛ? Тогда так:
if errorlevel 1 >>result.txt echo.%sURL%%%i


Добавлено:
видимо так?

Код: For /l %%i in (%ID%,1,%count%) do (
C:\unixutils\wbin\wget.exe "%sURL%=%%i" -Ofile.html
find /i "id=""zhead""" file.html
if errorlevel 1 >>result.txt echo.%sURL%=%%i
)
Автор: wolf0425
Дата сообщения: 18.01.2011 15:11
inock
Цитата:
Вот так заработало:

оптимист , о том почему не заработает как тебе надо твоя конструкция if errorlevel 0 goto end
попробуй сам понять из if /?
как писать If по ошибке правильно - тебе написал res2001

ну или если последний скачанный файл никуда ещё не нужен, и на экран ничего не нужно - то можно в одну строку:

Код: For /l %%i in (%ID%,1,%count%) do C:\unixutils\wbin\wget.exe "%sURL%=%%i" -q -O - | 1>nul find /i "id=""zhead""" || 1>>result.txt echo.%sURL%=%%i
Автор: inock
Дата сообщения: 18.01.2011 15:41

Цитата:
если поиск закончился не удачно, то выводишь УРЛ? Тогда так


Это уже мелочи отладки. Оконечный вариант скрипта:


Код: @echo off
set ID=301970
set STEPS=10
set sURL=http://vegacomp.ru/index.php?productID
set /a "count=ID+STEPS"
For /l %%i in (%ID%,1,%count%) do (call :swget %sURL% %%i)
goto :eof

:swget

echo start wget && C:\unixutils\wbin\wget.exe %1=%2 -Ofile.html
if errorlevel 1 goto fail

find /i "id=""zhead""" file.html
if errorlevel 1 echo %1=%2 >> result.txt
goto end

:fail
echo URL %1=%2 is error >> errors.txt

:end
exit /b
Автор: firsthar
Дата сообщения: 19.01.2011 01:58
вот ещё минитз.
вполне решабельно и для меня, но хотелось бы как-то поэлегантней....

ВСТУПЛЕНИЕ.

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

ЗАДАНИЕ.

необходимо что б каждый юзер мог проверять наличие других в программе перед входом и каким-то раком отсылать свой статус.

ДАНО.

ftp сервер.
юзание wget и wput допускается.

ВАРИАНТ ОТ МЕНЯ.

три батника.
1. online.cmd
создаёт файл ivanov.man на ftp
2. offline.cmd
удаляет файл ivanov.man на ftp
3. check.cmd
проверяет наличие ivanov.man, petrov.man, sidorov.man на ftp и выводит на экран.
Автор: res2001
Дата сообщения: 19.01.2011 08:41
firsthar
Туловища сидят в разных концах города и запускают одну и туже программу, видимо программа находится в каком-то одном месте и запускают через ... терминал например, зачем тогда геморой с ФТП?
Опиши подробней, как запускается прога.
Автор: bomzzz
Дата сообщения: 19.01.2011 08:50
никаких вгетов и цурлов не надо, зайди на фтп сервер командой ftp
Автор: firsthar
Дата сообщения: 19.01.2011 08:52
res2001
клиент для подключения к некоей бд.
проблема в том, что б не запалили более одной копии одновременно.
Автор: bomzzz
Дата сообщения: 19.01.2011 08:52
это пример н а использование самых важных команд , будет работаь

Цитата:

ECHO OFF
COLOR 9F
CLS
echo OPEN mirror.yandex.ru>MYFTP.txt
echo ANONYMOUS>>MYFTP.txt
echo 123>>MYFTP.txt
echo BELL>>MYFTP.txt
echo STATUS>>MYFTP.txt
echo DIR>>MYFTP.txt
echo CD mozilla>>MYFTP.txt
echo DIR>>MYFTP.txt
echo CD firefox>>MYFTP.txt
echo DIR>>MYFTP.txt
echo CD releases>>MYFTP.txt
echo DIR>>MYFTP.txt
echo CD 3.6.13>>MYFTP.txt
echo DIR>>MYFTP.txt
echo CD win32>>MYFTP.txt
echo DIR>>MYFTP.txt
echo CD ru>>MYFTP.txt
echo DIR>>MYFTP.txt
echo binary>>MYFTP.txt
echo get "Firefox Setup 3.6.13.exe">>MYFTP.txt
echo quit>>MYFTP.txt
ftp -s:myftp.txt
pause


Добавлено:
ну что не запалили надо сначала файл положить на фтп убедиться что он там один, и только после этого заходить
а это пример для закачки файла на гипотетический фтп не будет работать
Добавлено:

Цитата:

@ECHO OFF
COLOR 9F
CLS
echo OPEN ftp.myftp.ru>MYFTP.txt
echo login>>MYFTP.txt
echo password>>MYFTP.txt
echo BELL>>MYFTP.txt
echo STATUS>>MYFTP.txt
echo BINARY>>MYFTP.txt
echo PUT "myftp.txt">>MYFTP.txt
echo QUIT>>MYFTP.txt
ftp -s:myftp.txt
pause
Автор: res2001
Дата сообщения: 19.01.2011 08:55
ВАРИАНТ ОТ МЕНЯ.
Запускать прогу через промежуточный батник, который будет сначала проверять наличие файлов флагов, если они есть, то выводить соответствующее сообщение, если нет, создавать свой файл-флаг, запускать прогу, после окончания работы проги удалять свой файл-флаг.
Автор: bomzzz
Дата сообщения: 19.01.2011 08:56
вот не записал как обработку оошибок команды фтп делать, но если файлана сервере не будет он скачается с размером ноль. не важно же кто уже пользуется главное что пользуется, можно имя файла одно использовать а во внутрь записать че угодно главное хотя бы один байт

Добавлено:
нет должны быть разные имена. чтоб четко не войти вдвоем

Добавлено:
на народе.ру аккаунт зарегьте там фтп есть, и на почте.ру кается тоже, был по крайне ймере
Автор: res2001
Дата сообщения: 19.01.2011 09:22
bomzzz

Цитата:
нет должны быть разные имена. чтоб четко не войти вдвоем

Можно и одним файлом обойтись. Если нужно различать, кто именно занял можно в этот файл писать имя пользователя создавшего флаг.
Автор: bomzzz
Дата сообщения: 19.01.2011 09:25
нет тогда может быть так, что оба зайдут

Добавлено:
проверяешь отсутсвие файлов товарок, ложишь свой, еще раз проверяешь отсутсвие файлов и только после этого входишь. тогда никак оба не зайдут
Автор: MGrom
Дата сообщения: 19.01.2011 12:31
Добрый день!
Есть разветвленная структура папок. В них лежат куча файлов. Надо заархивировать файлы определенного расширения и архивы сложить именно там, где находятся источники.
Как реализовать на bat-файлах задачку? Или от чего отталкиваться?
Автор: lorents
Дата сообщения: 19.01.2011 13:20
Добрый день!
Подскажите, пожалуйста, почему код не работает, если у меня количество обрабатываемых папок больше 9?

Код: for %%i in (.\dir1\*.*) do (
    call :print "%%~nxi" "dir1\%%~nxi" "dir2\%%~nxi" "dir3\%%~nxi" "dir4\%%~nxi"
)

:print
echo %1;%~z2;%~z3;%~z4;%~z5 >>png.csv
exit /b
Автор: res2001
Дата сообщения: 19.01.2011 13:28
lorents

Цитата:
количество обрабатываемых папок больше 9

Что ты имеешь ввиду?
Сейчас тут обрабатывается только 4 папки.

Добавлено:
MGrom

Цитата:
Есть разветвленная структура папок

Папки надо обходить рекурсивно? Какая все же структура папок? Они лежат где-то в одной папке или разбросаны в разных местах по всему диску?
Архивировать файлы во всех вложенных подпапках или только в текущей папке? Архив создавать с каким именем?
Автор: lorents
Дата сообщения: 19.01.2011 13:49
res2001

Код: for %%i in (.\dir1\*.*) do (
    call :print "%%~nxi" "Dir1\%%~nxi" "Dir2\%%~nxi" "Dir3\%%~nxi" "Dir4\%%~nxi" "Dir5\%%~nxi" "Dir6\%%~nxi" "Dir7\%%~nxi" "Dir8\%%~nxi" "Dir9\%%~nxi"
)

:print
echo %1;%~z2;%~z3;%~z4;%~z5;%~z6;%~z7;%~z8;%~z9;%~z10 >>png.csv
exit /b
Автор: res2001
Дата сообщения: 19.01.2011 13:54
lorents
Ты можешь напрямую обратиться только к 9 параметрам, переданным в батник/процедуру (%0 я не считаю), для использования большего количества параметров надо использовать операцию shift и соответственно переписать процедуру print для ее использования.
Автор: lorents
Дата сообщения: 19.01.2011 14:00
res2001
понятно, пойду почитаю на счет shift, спасибо.
Автор: MGrom
Дата сообщения: 19.01.2011 14:03

Цитата:
Цитата:
Есть разветвленная структура папок

Папки надо обходить рекурсивно? Какая все же структура папок? Они лежат где-то в одной папке или разбросаны в разных местах по всему диску?
Архивировать файлы во всех вложенных подпапках или только в текущей папке? Архив создавать с каким именем?


Есть корневая папка, в ней ряд подпапок, в которых встречаются файлы с расширениями *.log. Нужно чтобы батник прошарил все эти подпапки, и где встречаются фалы log заархивировал их, причем архив в каждой папке создавался свой. Имя все равно, можно например по названию папки в которой он находиться.
Автор: res2001
Дата сообщения: 19.01.2011 14:14
MGrom
файлы удалять после архивирования?
Автор: firsthar
Дата сообщения: 19.01.2011 14:22

Цитата:
если файлана сервере не будет он скачается с размером ноль

нафига ему качаться? просто проверить бы его наличие.
Автор: res2001
Дата сообщения: 19.01.2011 14:46
MGrom
Как-то так получилось:
для начала установи правильно переменную pdir во второй строке - обрабатываемый каталог.

Код: @echo off
set "pdir=D:\test\1\"

call:recurs "%pdir%" *.log
goto:eof

:recurs
set "fname=%~1"
call:getfname "%fname:~0,-1%"
for %%a in ("%~1%~2") do (
    >nul 7z u "%~1%fname%.7z" "%~1%~2"
    echo del /f/q "%~1%~2"
    goto:next
)
:next
for /d %%a in ("%~1*") do call:recurs "%%~dpnxa\" "%~2"
exit /b

:getfname
set "fname=%~nx1"
exit /b
Автор: MGrom
Дата сообщения: 19.01.2011 15:37

Цитата:
@echo off
set "pdir=D:\test\1\"

setlocal enabledelayedexpansion
call:recurs "%pdir%" *.log
goto:eof

:recurs
set "fname=%~1"
call:getfname %fname:~0,-1%
for %%a in ("%~1%~2") do (
>nul 7z u "%~1%fname%.7z" "%~1%~2"
echo del /f/q "%~1%~2"
goto:next
)
:next
for /d %%a in (%~1*) do call:recurs "%%~dpnxa\" "%~2"
exit /b

:getfname
set "fname=%~nx1"
exit /b


pdir поправил на D:\Test, создал десяток подпапок.
7z исправил на 7za консольная версия.
Странно, первые две папки проходит на третей спотыкается с ошибкой.
И имя архива везде пишет одно и тоже Новая.7z.

D:\Test>test.bat
del /f/q "D:\Test\Новая папка\*.log"
del /f/q "D:\Test\Новая папка (2)\*.log"
Непредвиденное появление: \*).
Автор: res2001
Дата сообщения: 19.01.2011 16:06
MGrom
Не отладил на длинных именах.
Поправил код, поставил кое-где недостающие кавычки.
Автор: MGrom
Дата сообщения: 19.01.2011 16:43

Цитата:

Не отладил на длинных именах.
Поправил код, поставил кое-где недостающие кавычки.


Отлично работает, будем тестировать на боевой системе )
Спасибо!

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: зависает установка Windows XP: 39 минут


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