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

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

Автор: mugil_cephalus
Дата сообщения: 15.10.2009 15:02
wolf0425

Цитата:
Ну скажи спасибо ему или переводчику.
Как правильно - можешь потестировать сам или поискать на microsoft.com

как правильно - вот ответ:
F:\Documents and Settings\admin>if /?
Оператор условного выполнения команд в пакетном файле.

IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда

скобок нет... (если не расматривать конструкцию с else) У станека не верно.

Добавлено:
wolf0425

Цитата:
замечательно. предположим что у тебя errorlevel=1
для такого кода сочетание (errorlevel 0) равно true так как 1 больше чем прописанный для сравнений 0

в команде if ErrorLevel 1 goto :error
переход происходит при значениях %ErrorLevel% 1 или больше

Хочешь сравнивать на равно - сравнивай числа сам и на равенство, а не проси готовый результат сравнения %ErrorLevel% >= число.

я что-то тебя не пойму - у меня же код с NOT:

Цитата:
:type1
type 83572.txt
if not ErrorLevel 0 (goto type1)


type 83572.txt у меня, кажется, выдает errLvl 1, но 1 точно не равен 0
Автор: wolf0425
Дата сообщения: 15.10.2009 15:59

Цитата:
type 83572.txt у меня, кажется, выдает errLvl 1, но 1 точно не равен 0

ну да, он не только не равен - он больше

внимательно читаем if /?
ERRORLEVEL number
Specifies a true condition if the last program run returned an exit code equal to or greater than the number specified.

еще вопросы?
Автор: mugil_cephalus
Дата сообщения: 15.10.2009 16:01
01MDM
NIKZZZZ
wolf0425

взял код от NIKZZZZ

Цитата:
Гарантировано:

Код:if %errorLevel% NEQ 0 goto type1

И лучше использовать именно такой синтаксис.

вот скрипт:
echo on

:type1
type 83572.txt
if %ErrorLevel% neq 0 goto type1

pause

все работает (всем спасибо)

вопрос: кто-нибудь знает, сколько будет по времени так крутится этот бесконечный цикл (время как-то регламентировано в настройках cmd или нет)
Автор: wolf0425
Дата сообщения: 15.10.2009 16:13

Цитата:
вопрос: кто-нибудь знает, сколько будет по времени так крутится этот бесконечный цикл (время как-то регламентировано в настройках cmd или нет)
бесконечно, пока этот cmd не закроют извне.

и такой цикл очень нехило жрет процессор, так что полезно влепить в цикл какую-то паузу, например так:
Код: :type1
type 83572.txt
if ErrorLevel 1 ping -n 2 localhost >nul && goto type1
Автор: 7ead3471
Дата сообщения: 15.10.2009 16:53
Проблема решена.
нужно было убрать пробел в конце строк:
echo %LOGIN%>>FTP.txt
итд.

Автор: mugil_cephalus
Дата сообщения: 15.10.2009 17:37
wolf0425

Цитата:
внимательно читаем if /?
ERRORLEVEL number
Specifies a true condition if the last program run returned an exit code equal to or greater than the number specified.


да я с этим не спорю, просто я никак не могу понять твои тезисы соотнесенно моему коду - if NOT ErrorLevel 0 (goto type1) - , где есть конструкция NOT

F:\Documents and Settings\admin>if /?
Оператор условного выполнения команд в пакетном файле.

NOT Обращает истинность условия: истинное условие
становится ложным, а ложное - истинным.

Добавлено:
wolf0425

Цитата:
и такой цикл очень нехило жрет процессор,

у меня жрал ~50% - менее, чем какая-либо игра, вирт. память - вообще не росла (катал цикл минут 5)


Добавлено:
wolf0425

Цитата:
и такой цикл очень нехило жрет процессор, так что полезно влепить в цикл какую-то паузу, например так:
Код::type1
type 83572.txt
if ErrorLevel 1 ping -n 2 localhost >nul && goto type1


см. в шапке - Делаем паузу в командном файле стандартными средствами Windows http://forum.ru-board.com/topic.cgi?forum=62&topic=11825&start=1300#6

Цитата:
Чаще всего для этих целей предлагают команду ping. Лично мне совершенно не нравится этот способ. Задержка, даваемая командой ping очень неточна. Более того, она очень зависит от настроек сети. У меня был случай, когда из-за файрвола пауза получалась какая угодно, но только не та, что была задана в команде.
Автор: wolf0425
Дата сообщения: 16.10.2009 00:31

Цитата:
Чаще всего для этих целей предлагают команду ping. Лично мне совершенно не нравится этот способ. Задержка, даваемая командой ping очень неточна.
так нам точность задержки как раз совершенно не критична, а вот то что ping.exe в 10 раз короче cscript.exe - дает небольшую разницу в пиковой нагрузке на процессор/память/файловую систему и не требует попутного мусора в батнике.

Ну и вот я сейчас сравнил варианты ping и sleep.js
десять вызовов 1-секундных пингов плюс 1 echo %time% заняли 10.71сек.
десять вызовов 1000-милисекундных sleep.js и echo %time% заняли 12.5 сек.
повторил - 10.53 и 11.64
Это к вопросу о их сравнительной точности


Цитата:
просто я никак не могу понять твои тезисы соотнесенно моему коду - if NOT ErrorLevel 0 (goto type1) - , где есть конструкция NOT
NOT инвертирует состояние false/true, выдаваемое ErrorLevel 0
сам ErrorLevel 0 - одинаково выдает true для любого кода ошибки, который может вернуть команда type, так как он у нее никогда не меньше нуля.
А ты почему-то три раза пытался убедить, что при возврате ошибки 1 что-то в этом if должно отличаться от случая возврата признака успеха 0, на основании того что 1 != 0.
в конструкции ErrorLevel N сравнивается не на равенство, if /? я выше процитировал.

Задуманный микрософтом вариант перехода по любому неуспеху type - это if errorlevel 1 goto


Цитата:
у меня жрал ~50% - менее, чем какая-либо игра
на двухядерном, наверно?
или просто гипертрейдинг так помогает? Или кто-то еще пытался на 100% загрузить проц?

на старых процах такой цикл без задержки и конкурентов - жрет 100% совершенно не напрягаясь, да еще и файловые опрерации подтормаживая. проверено многократно.
с добавленным пингом - 0%, как ожиданию и положено. а что появившийся файл заметит в среднем на полсекунды позже - так наверно же пофиг?
Автор: ponand
Дата сообщения: 16.10.2009 08:34
А можно чем нибудь батник свернуть к часам ?
Автор: Ninja33
Дата сообщения: 16.10.2009 09:42
Здравствуйте! Ребята, помогите решить такую задачу: На диске С: есть папка DIR1, в ней лежит около ста папок с разными названиями, например 1,2,3...100. В папках 1,2,3...100 находятся разные файлы, но в каждой из них, есть один текстовый файл с именем Log.txt. Также на диске С: есть папка DIR2 в ней папки с именами, аналогично как в DIR1, т.е.1,2,3...100,но пустые... Нужно из каждого подкаталога в С:\DIR1 скопировать Log.txt, в соответсвующую папку в С:\DIR2....То есть из С:\DIR1\1 скопировать файл Log.txt, в С:\DIR2\1, из С:\DIR1\2 скопировать Log.txt в С:\DIR2\2 и т.д. Зарание спасибо!
Автор: 01MDM
Дата сообщения: 16.10.2009 10:27
Ninja33

Код:
@echo off
pushd "c:\dir1"
for /d %%i in (*) do copy "%%i\log.txt" "c:\dir2\%%i\log.txt"
popd
Автор: Ninja33
Дата сообщения: 16.10.2009 11:21
01MDM ,спасибо большое, все работает...!
Автор: bpof
Дата сообщения: 16.10.2009 13:35
Помогите скрпит наисать.

Есть фтп. у каждой учётной записи своя папка (C:\ftp\%username%)
задача: удолять файлв в папках пользователей старше 7 дней, не удоляя самих папок пользователей.

если исользовать команду del, то надо для каждой папки нового пользователя дописывать batник. это не айс.

хочется чтоб удалялись все файлы и папки дальше 3его уровня.
Автор: king_stiven
Дата сообщения: 16.10.2009 13:41
bpof
В шапке много интересного.
Автор: bpof
Дата сообщения: 16.10.2009 13:58
king_stiven
ткните пальцем, не найду никак.
Автор: noiseless
Дата сообщения: 16.10.2009 14:16
bpof
См. внимательней сюда
Автор: bpof
Дата сообщения: 16.10.2009 14:37
noiseless
смотрел. ничего для себя не увидел.
в задаче неизвестно имя 3его уровня. как это в bat ввести?

надо просто удолить все папки 3его уровня, команда del /f /s /q C:\del\*\*.* это не может. что использовать вместо C:\del\*\ ??
Автор: noiseless
Дата сообщения: 16.10.2009 15:38
bpof
Вот, например, как получить список всех поддиректорий в папке "ftp":
for /f "tokens=*" %%i in ('dir C:\ftp /a:d /B') do echo %%i
Автор: mugil_cephalus
Дата сообщения: 16.10.2009 15:44
wolf0425

Цитата:
NOT инвертирует состояние false/true, выдаваемое ErrorLevel 0
сам ErrorLevel 0 - одинаково выдает true для любого кода ошибки, который может вернуть команда type, так как он у нее никогда не меньше нуля.
А ты почему-то три раза пытался убедить, что при возврате ошибки 1 что-то в этом if должно отличаться от случая возврата признака успеха 0, на основании того что 1 != 0.
в конструкции ErrorLevel N сравнивается не на равенство, if /? я выше процитировал.


тогда получается такой дискурс: errorlevel 0 при %errorlevel%=1 будет true, а NOT должен инвертировать на false, а if false не выполнит goto :type1 в конструкции if not errorlevel 0 goto type1 (как это было бы при if true: if true выполняет goto :type1)

Цитата:
на двухядерном, наверно?
или просто гипертрейдинг так помогает? Или кто-то еще пытался на 100% загрузить проц?

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

2,6 ггц 1 ядро гипертрейдинг
для wait'a/sleep'a я не хочу использовать VBS (это оффтоп, ИМХО) и ping (как не рекомендовали в шапке) Кстати, у меня wait ping'om - все окей (фаервол однин раз спросил - я разрешил ping)
Автор: wolf0425
Дата сообщения: 16.10.2009 17:46

Цитата:
тогда получается такой дискурс: errorlevel 0 при %errorlevel%=1 будет true
да

Цитата:
а NOT должен инвертировать на false
да

Цитата:
а if false не выполнит goto :type1 в конструкции if not errorlevel 0 goto type1
да. и это является ответом на первоначальный вопрос

Цитата:
никак не могу понять, где ошибка:
после if not ErrorLevel 0 (goto type1) он сразу перескакивает на pause, а не возвращается на метку :type1


для секундной паузы где-то в шапке была sleep.exe - но ее же таскать надо, пинг в этом смысле удобнее - он везде есть. Кстати боюсь что про 50% загрузки - это тебя процессор обманывает: запусти батник без пинга параллельно с просмотром видео, что-ли.
Автор: mugil_cephalus
Дата сообщения: 16.10.2009 18:01
wolf0425
из идеологических соображений (не хочу использовать VBS (это оффтоп, ИМХО) и ping -n localhost (как не рекомендовали в шапке)) - "только "язык" батников и ничего кроме" , написал себе sleep-батник с иной конструкцией - schtasks - он еще "сырой", я не закончил его тестировать, и вижу много возможностей для оптимизации кода профи с форума, но я дальнейшую оптимизацию - читай сокращение скрипта - не осилю...

@echo off
cls

:morpheus
set dirPathMorpheus1=%temp%
set jobMorpheus1=morpheus1J.job
set waitModifierMorpheus1=1
set outputMorpheus1=nul
echo schtasks /delete /tn %jobMorpheus1:~0,-4% /f > %dirPathMorpheus1%\morpheus1T.bat 2>&1
echo I have woken up! > %dirPathMorpheus1%\typeme2.txt 2>&1
echo ren %dirPathMorpheus1%\typeme2.txt typeme1.txt >> %dirPathMorpheus1%\morpheus1T.bat 2>&1

:if_exist_%jobMorpheus1%
if exist %systemroot%\tasks\%jobMorpheus1% (goto exist_%jobMorpheus1%)
schtasks /create /ru *** /rp *** /sc minute /mo %waitModifierMorpheus1% /tn %jobMorpheus1:~0,-4% /tr %dirPathMorpheus1%\morpheus1T.bat
goto typeme
:exist_%jobMorpheus1%
schtasks /delete /tn %jobMorpheus1:~0,-4% /f
goto if_exist_%jobMorpheus1%

:typeme
@echo off
echo Please wait...
rem Countdown: The result has not been counted up yet.
rem setlocal enabledelayedexpansion
rem for /f "tokens=* usebackq" %%A (`schtasks /query`) do (if /i %jobMorpheus1:~0,-4% eql %%A (set endTimeMorpheus1=%%B))
rem echo Countdown: !countdownMorpheus1!
type %dirPathMorpheus1%\typeme1.txt > %outputMorpheus1% 2>&1
if %ErrorLevel% neq 0 goto typeme

cd /d %dirPathMorpheus1%
del /q morpheus1T.bat typeme1.txt
set dirPathMorpheus1=
set jobMorpheus1=
set waitModifierMorpheus1=
set outputMorpheus1=
echo Morpheus has finished.

pause

P.S.
да countdown еще не расчитал...

Добавлено:
wolf0425

Цитата:
для секундной паузы где-то в шапке была sleep.exe - но ее же таскать надо, пинг в этом смысле удобнее - он везде есть. Кстати боюсь что про 50% загрузки - это тебя процессор обманывает: запусти батник без пинга параллельно с просмотром видео, что-ли.

батник без ping'a дает: ~50%, где 30%-40% у cmd.exe и ~10% у какого-то csrss.exe
далее: + запуск *.mp4 -> без изменений (wmplayer.exe еще - ~3%-5%)
всего процессов: ~55


wolf0425

я сейчас понял (если не ошибся) , как в подпрограмме :typeme избежать ~50% загрузкии CPU:
в подпрограмме :typeme нужно запустить notepad или калькулятор (или что-то подобное - явно не нужное/не запущенное - (или winmine.exe, mshearts.exe, %SystemRoot%\system32\timedate.cpl)) без комманды start, чтобы cmd (выполнение батника) "зависло"/ожидало закрытия notepad'a или калькулятора, а в подпрограмме :morpheus вбить код echo taskkill notepad/calc.exe > %dirPathMorpheus1%\morpheus1T.bat 2>&1

добавление: еще лучше в в подпрограмме :typeme запуск без команды start *.vbs-файла с примерно таким кодом wscript.echo Please wait %waitModifierMorpheus1% minute(s)....
Автор: king_stiven
Дата сообщения: 17.10.2009 06:44
bpof
CD /D C:\1
for /d %%e in (*) do (
PushD "%%e"
if not errorlevel 1 RD /s /q .
PopD
)
Автор: mugil_cephalus
Дата сообщения: 17.10.2009 18:10
по поводу вызова из батника кодов/ф-ций из *.DLL наткнулся на такую вещь (правда, не *.bat, а VBS) - http://www.robvanderwoude.com/files/getrundl_vbs.txt (это же - http://www.robvanderwoude.com/wmiexamples.php файл GetRunDL.vbs) вот description GetRunDL.vbs: List all RUNDLL(32) commands for file associations from the registry
пока разбираюсь, но, ИМХО, - небольшой паллиатив
Автор: Aleksei_N
Дата сообщения: 18.10.2009 10:22
Помогите написать скрипт.
Есть список URL (одна строка - один адрес), нужно что бы скрипт перешел по первому адресу, если в ответ пришла картинка (gif), то не чего не делать, а если пришел ответ "Not found" то адрес записывается в файл txt, затем берется следующий адрес и т.д. При этом http:// должно подставляться автоматически
Автор: olemel
Дата сообщения: 18.10.2009 13:13
Помогите пожалуйста настроить все сетевые соединения на компьютере, естественно cmd/bat - файлом. Что в это входит:
настройка протокола TCP/IP сетевой карты - я уже реализовал

@echo off
netsh interface ip set address name="Подключение по локальной сети" static 192.168.1.2 255.255.255.0 192.168.1.1 0
netsh interface ip set dns name="Подключение по локальной сети" static 82.209.213.60 primary
netsh interface ip add dns name="Подключение по локальной сети" 193.232.248.2 2
exit

Осталось только создать 2 диалап соединения и 2 ADSL соединения, нашел способ копирования Rasphone.pbk (телефонной книги). Ну это все не то, можно ли создать эти все соединения cmd/bat - файлом?
Автор: Iacoyn
Дата сообщения: 19.10.2009 13:16
rasdial вам в помощь
Автор: olemel
Дата сообщения: 19.10.2009 17:13

Цитата:
rasdial вам в помощь

мне нужно создать соединения, а не запускать уже готовое соединение, запускать будут пользователи.
Автор: slay1212
Дата сообщения: 21.10.2009 10:39
Можно в бат файле редактировать к.-нибудь файл параметров. Как вывести параметры понятно
for /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (
set %%i=%%j
)
в как их редактировать в диалоге? В бате это возможно?
Автор: Karrakurt
Дата сообщения: 21.10.2009 10:52
Проконсультируйте пжл, что я делаю не так?

Код: @ECHO off

REM SET Tst=0
SET Chk=1 2 3 4 5

FOR %%a IN (%Chk%) DO (
    SET Tst=%%a
    ECHO Tst = %Tst%
    )
Автор: Elroir
Дата сообщения: 21.10.2009 12:03
Karrakurt

Код:
@ECHO off
setlocal enabledelayedexpansion
SET Chk=1 2 3 4 5

FOR %%a IN (%Chk%) DO (
SET Tst=%%a
ECHO Tst = !Tst!
)
Автор: Joo1z
Дата сообщения: 21.10.2009 13:05
Karrakurt
Потому-что...

Код: @ECHO off
setlocal enabledelayedexpansion
SET Tst=0
SET Chk=1 2 3 4 5

FOR %%a IN (%Chk%) DO SET Tst=%%a & ECHO Tst = !Tst!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

Предыдущая тема: во вкладке автозагрузка


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