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

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

Автор: ComradG
Дата сообщения: 11.07.2010 16:31
res2001
Вот накидал на скорую руку консольный обозреватель кодировок винды. Может из того, что выводит прога подойдет по сабжу UTF8.
Автор: nemoW
Дата сообщения: 11.07.2010 16:45
res2001
Спасибо!
Автор: ComradG
Дата сообщения: 11.07.2010 17:13
res2001
Мда, судя по показаниям моей программулины UTF8 только 65001. По крайней мере на ХР.
Автор: sergsdl
Дата сообщения: 11.07.2010 22:27
Здравствуйте!
У меня просьба (я только недавно начал работать с батниками, но опыт в программировании есть).
Не могли бы Вы подсказать как в батнике реализовать следующий алгоритм действий :
1- проверка наличия процесса (например: опера.ехе)
2- если есть, то убить процесс
3- если нет, то подождать 40 минут и вернуться в начало к строке 1

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

И ещё такой алгоритм... (не сочтите за наглость... нужда заставляет)

1- проверка наличия процесса (например: опера.ехе)
2- если нет, то подождать 60 минут и вернуться в начало к строке 1
3- если да, то перейти к строке 4
4- проверка системного времени
5- если время больше или равно 22.00, то убить процесс (например: опера.ехе)
6- если нет, то подождать 60 минут и вернуться в начало к строке 1
Автор: wolf0425
Дата сообщения: 11.07.2010 23:15
sergsdl
Цитата:
2- если есть, то убить процесс
убили, а дальше что - завершить батник или продолжить с п.3?
для варианта "завершить" :

Код: :_loop
tasklist | 1>nul findstr /i /b opera.exe && taskkill.exe /f /t /im opera.exe & exit
1>nul ping localhost -n 2401
goto :_loop
Автор: sergsdl
Дата сообщения: 12.07.2010 00:07
Спасибо огромное!
Но завершать батник не надо... он должен висеть в процессах и периодически проверять наличие процесса и УБИВАТЬ его... Поэтому и нужна зацикленность...

В общем ещё раз спасибо! Буду пробовать...

П.С. Не могли бы Вы поподробней обьяснить следующую строчку (что делают эти команды?) для моего ликбеза? Я понимаю что это проверка системного времени, но хотелось бы поподробней узнать принцип этих команд. (надеюсь вроде конкретно всё обьяснил ... как мог)

Добавлено:
Ой, забыл строчку вписать

Вот она

if %time:~0,2% GEQ 22 taskkill.exe /f /t /im opera.exe & exit

что значат эти команды

%time:~0,2% (проверка времени с погрешностью?)
GEQ 22 (вообще нигде не встречал и не знаю этой команды)

остальное в этой строчке мне понятно...
Автор: wolf0425
Дата сообщения: 12.07.2010 03:38

Цитата:
что значат эти команды

%time:~0,2% - две первых цифры текущего времени (HH:MM:SS,ss) т.е сколько часов.
хэлп по :~0,2 - читай в set /?

if %time:~0,2% GEQ 22 ... - это "если сейчас часов больше или равно 22, т.е. время 22:* или 23:* , то ... "
GEQ - это буквенный эквивалент >=
кстати, если будешь читать if /? и у тебя русские ХР - учти что в хэлпе ошибка и сравнение == пишется буквами не EQL a EQU


Цитата:
Но завершать батник не надо...
ну значит все & exit сам поубираешь...
Автор: BVV63
Дата сообщения: 12.07.2010 05:18
king_stiven

Цитата:
То есть пробелов в пути никогда не бывает? Пример:
c:\12 34\1.txt 0 0\0d:\pagefile.sys 1024 2048\0e:\pagefile.sys 1024 1024

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

Добавлено:
mugil_cephalus

Цитата:
у меня все работает

Попробовал под XP, там работает (под XP команда Reg выдаёт 2 дополнительные строки сверху - свою версию и пустую строку). Под 2K3 не работает .

Цитата:
включи эхо

Включено. Говорит, переменная не определена. Листинг:
[more]
C:\WINDOWS\Tasks\Skripts>setlocal enabledelayedexpansion

C:\WINDOWS\Tasks\Skripts>set "cnt=1"

C:\WINDOWS\Tasks\Skripts>for /f "tokens=3" %%a in ('reg query "HKLM\System\Curren
tControlSet\Control\Session Manager\Memory Management" /v PagingFiles ^|more +4')
do (
set "PagingFiles!cnt!=%%~a"
set /a cnt=!cnt!+1
)

C:\WINDOWS\Tasks\Skripts>set PagingFiles
Environment variable PagingFiles not defined

C:\WINDOWS\Tasks\Skripts>pause
Press any key to continue...
[/more]
Работает лишь с More +2, но выдаёт лишь первый файл.

Добавлено:
Даже под XP Ваш код получает лишь первый файл. Первый-то файл я и сам легко могу получить (пример для 2K3, для XP Skip=4, ну или ^|Find /I "PagingFiles" - для универсальности):

Код: For /F "Skip=2 Tokens=3 UseBackQ" %%A In (
    `Reg Query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /V "PagingFiles"`
    ) Do Set PagingFiles=%%A
Set PagingFiles
Автор: res2001
Дата сообщения: 12.07.2010 07:26
BVV63

Цитата:
Что-то ничего не выводит

В цикле поставь разделителями табулятор (delims=<TAB>), у меня стоял таб, но видимо форумный движок его заменил на пробелы.
Должно работать.

Добавлено:

Цитата:
Саму идею я понял, не знал, что в переменной можно таким образом проводить замену. Но остаются ещё числа, которые нафиг не нужны.


Код: @echo off
setlocal enabledelayedexpansion
for /f "tokens=3 delims=    " %%a in ('reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /v PagingFiles ^| findstr "PagingFile"') do (
set "val=%%a"
set "val=^"!val:\0=^" ^"!^""
call :printparam !val!
)
goto:eof

:printparam
if "%~1" equ "" exit /b
for /f "tokens=1" %%b in ("%~1") do echo.%%b
shift
goto :printparam
Автор: BVV63
Дата сообщения: 12.07.2010 08:10
Усё, написал наконец-то. Уфф... Большое спасибо всем за помощь. Помогла замена \0 на пробел. Получился такой вариант:

Код: ClS
SetLocal EnableDelayedExpansion
For /F "Skip=2 Tokens=2* UseBackQ" %%A In (
    `Reg Query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /V "PagingFiles"`
    ) Do (
    Set Files=%%B
    )
Echo %Files%
Set Files=%Files:\0= %
Echo %Files%
For %%A In (%Files%) Do (
    If %%A GEq A (
        Set PagingFiles=!PagingFiles! %%A)
        )
    )
Echo %PagingFiles%
Автор: res2001
Дата сообщения: 12.07.2010 08:33
BVV63

Цитата:
А что делает Delims= ? Т. е. без параметров?

Очень даже с параметрами - у меня после равно стоит символ табуляции.
А без параметров - будет то же самое что и tokens=* - т.е. в переменную присвоится вся строка.

Цитата:
Усё, написал наконец-то.

Ну еще на последок убери из переменной PagingFiles первый пробел:
Echo %PagingFiles:~1%


Добавлено:
Кстати: а отрабатывает ли твой скрипт в случае нескольких pagingfiles?
Что-то мне подсказывает, что нет
Автор: BVV63
Дата сообщения: 12.07.2010 08:43
res2001

Цитата:
Кстати: а отрабатывает ли твой скрипт в случае нескольких pagingfiles?

Да нет, работает. Специально 3 штуки в реестре прописал, для проверки.
Автор: res2001
Дата сообщения: 12.07.2010 08:55
BVV63
Странно, а у меня не отрабатывает твой код на нескольких файлах.

Добавлено:
аа, нет, срабатывает, сори, сам дурак
Автор: mugil_cephalus
Дата сообщения: 12.07.2010 12:06
res2001

Цитата:
А без параметров - будет то же самое что и tokens=* - т.е. в переменную присвоится вся строка.

http://forum.ru-board.com/topic.cgi?forum=62&topic=19668&start=1140#16
Автор: res2001
Дата сообщения: 12.07.2010 12:19
mugil_cephalus
Верно, спс. за наводку, в случае с token=* разделить не пустой, поэтому начальные разделители отбрасываются.
Автор: mugil_cephalus
Дата сообщения: 12.07.2010 12:25
wolf0425

Цитата:
у меня впечатление что этот ключик просто навсегда переключает вывод

надеяюсь только на время сеанса, не в рееестре же прописывается...
Автор: wolf0425
Дата сообщения: 12.07.2010 12:52

Цитата:
надеяюсь только на время сеанса
да, на время сеанса, но вот chcp в сеансе перестают влиять на кодировку вывода того же dir>file. Хотя кодировка ввода по прежнему переключается.
Автор: BVV63
Дата сообщения: 12.07.2010 12:54
Возникло сразу 2 вопроса. В переменной содержатся имена файлов через пробел. Можно ли вывод переменной

Код: For %%A In (%Var%) Do Echo %%A
Автор: wolf0425
Дата сообщения: 12.07.2010 13:10

Цитата:
И я не совсем понимаю, как его организовать, дабы не произошло конфликта.
кроме переменных %%a и %%А есть ещё 50 свободных буковок и 10 циферок, для организиции цикла с одной переменной - используй любую незанятую. цикл занимает обычно одну переменную, а не 26. Впрочем сколько занимает for /f - задается в команде, там часто более одной бывает требуется.

Код: for %%a in ( 1 2 3 ) do for %%b in ( 4,5,6 ) do for %%c in ( 7;8;9 ) do echo.%%a%%b%%c
Автор: BVV63
Дата сообщения: 12.07.2010 13:21
wolf0425
Со вторым вопросом, кажется, сам разобрался. Во первом цикле %%A, во втором цикле вместо %%a прокатывает %%B. Стал быть строчные буквы остаются вакантными. Сейчас уже нет времени, завтра вернусь к батнику.

Добавлено:

Цитата:
кроме переменных %%a и %%А есть ещё 50 свободных буковок и 10 циферок

Это как? В смысле: циферки-то разве можно использовать?
Автор: wolf0425
Дата сообщения: 12.07.2010 14:11

Цитата:
Это как? В смысле: циферки-то разве можно использовать?
ну да, какие проблемы?

Код: for %%1 in ( 1 2 3 ) do for %%2 in ( 4,5,6 ) do for %%3 in ( 7;8;9 ) do echo.%%1%%2%%3
Автор: mugil_cephalus
Дата сообщения: 13.07.2010 09:51
wolf0425
а еременных еще больше... попробуй... ( у меня работает на win 5.1 ru )

Код: chcp 1251
ipconfig
for /f "tokens=1,2" %%э in ('ipconfig') do (
set "var1=%%~э"
set "var2=%%~ю"
)
set var
pause
Автор: res2001
Дата сообщения: 13.07.2010 10:20
mugil_cephalus
действительно работает но я бы не стал использовать русские имена переменных.
Кстати, не только так работает, но и так:

Код: set "переменная1=%%~э"
set "переменная2=%%~ю"
Автор: mugil_cephalus
Дата сообщения: 13.07.2010 10:38
res2001
в set чего только не "всунешь"...
Автор: errone
Дата сообщения: 13.07.2010 17:31
Забанят его в конце концов

Цитата:
Сообщить модератору
нажато
Автор: BVV63
Дата сообщения: 14.07.2010 06:34
Интереса ради полюбопытствовал в инете разницу между cmd и bat. И случайно на одном левом форуме ( http://www.sql.ru/forum/actualthread.aspx?bid=24&tid=423401&hl=cmd+bat ) узнал, что в cmd-скриптах можно также использовать REXX. Ну, REXX я не знаю, но всё равно интересно. Такой вопрос: что, cmd-скрипты, содержащие кроме "чистой батаники" ещё и REXX, Cmd.exe сам умеет обрабатывать, или дополнительное ПО требуется?

Добавлено:
Всё, вопрос снят (нужно было дочитать в том форуме до конца): REXX не для Виндузы. Точнее, не для виндузных cmd-скриптов.
Автор: mugil_cephalus
Дата сообщения: 14.07.2010 06:47
а у меня что то нет файла %systemroot%\fonts\terminal.fon
тогда где же сидит точечный шрифт консоли ?
Автор: BVV63
Дата сообщения: 14.07.2010 06:49
mugil_cephalus
Так в свойствах консоли есть же вкладка "Font". В ней указано, какой шрифт текуще используется.

Добавлено:
Хм... У меня "Raster Fonts" указано, но на какой конкретно шрифт это указывает, я тоже не знаю.

Добавлено:
Но не "Terminal". В блокноте выбрал "Terminal", не похоже ни разу.
Автор: mugil_cephalus
Дата сообщения: 14.07.2010 07:07
BVV63

Цитата:
Так в свойствах консоли есть же вкладка "Font".

у меня указан - терминал ( win 5.1 ru )
хочу найти физический файл
%systemroot%\fonts\lucon.ttf ( люсида ) есть
p.s.
наверное только wolf0425 знает ( из gsp )
Автор: BVV63
Дата сообщения: 14.07.2010 07:25
mugil_cephalus
Все, которые начинаются на cga и ega, стандартный виндузный просмотрщик фонтов называет "Terminal". Может и ещё какие.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


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