Ru-Board.club
← Вернуться в раздел «Программы»

» Командная строка, батники, сценарии (bat, cmd)

Автор: 01MDM
Дата сообщения: 18.05.2009 09:41
ScreamWolf
Что-то как-то "?" Перечитал 3 раза, но не уловил.
Автор: king_stiven
Дата сообщения: 18.05.2009 10:20
ScreamWolf

Код: FOR /L %%a IN (0,1,9) DO (
for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z ) do (
FOR /L %%c IN (0,1,9) DO (
FOR /L %%d IN (0,1,9) DO (
FOR /L %%e IN (0,1,9) DO (
FOR /L %%f IN (0,1,9) DO (
if exist nnn%%a%%b%%c%%d%%e%%f команда
)
)
)
)
)
)
Автор: 01MDM
Дата сообщения: 18.05.2009 10:24
king_stiven

Цитата:
if exist nnn%%a%%b%%c%%d%%e%%f команда


Вот мне и не понятно. Если уже определена переменная %CHECKFILE%, то зачем все это нужно? Можно просто:

Код:
if exist %checkfile% команда
Автор: king_stiven
Дата сообщения: 18.05.2009 10:45
01MDM

Цитата:
ВОТ УСЛОВИЕ
некая перменная CHEKFILE=nnnXmYYYY
где:
"n" - это латинские буквы (значение постоянное)
"X" - это цыфра от 1 до 9
"m" - это латинские буквы от "a" до "z"
"Y" - это число от 0000 до 9999

Автор: KPOBABAK
Дата сообщения: 18.05.2009 11:04
HaK1R

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

возможно бантичек будет запускаться через шулдер

предыдущий вариант не подходит, потому что пользователь может отрубить процесс, и там в режиме ожидания видно черное досовское окно
Автор: basstard
Дата сообщения: 18.05.2009 11:51
ScreamWolf

все то же, что написал king_stiven, только с set'ом:

Код: @echo off
setlocal enabledelayedexpansion
FOR /L %%a IN (0,1,9) DO (
    for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
        FOR /L %%c IN (0,1,9) DO (
            FOR /L %%d IN (0,1,9) DO (
                FOR /L %%e IN (0,1,9) DO (
                    FOR /L %%f IN (0,1,9) DO (
                        if exist "<путь>\nnn%%a%%b%%c%%d%%e%%f" (
                            set CHEKFILE=nnn%%a%%b%%c%%d%%e%%f
                        )
                    )
                )
            )
        )
    )
)
echo !CHEKFILE!
pause
Автор: 01MDM
Дата сообщения: 18.05.2009 12:38
ScreamWolf
king_stiven, basstard
Я бы сделал по другому, если правильно понял, то нужно просто при следующем запуске батника пропустить уже обработанные файлы:

Код:
@echo off
setlocal

echo == nnn.list == 1>nnn.list
dir /b | findstr nnn[0-9][a-z][0-9][0-9]* 1>>nnn.list

if not exist nnn.log echo == nnn.log == 1>nnn.log
for /f %%i in (nnn.log) do set /a skip+=1

for /f "skip=%skip%" %%i in (nnn.list) do (
echo %%i 1>>nnn.log
set "file=%%i"
goto:exec
)

:exec
if defined file (
echo somecommand %file%
)
del nnn.list
Автор: king_stiven
Дата сообщения: 18.05.2009 13:07
01MDM
да, findstr ом лучше.Просто человек просил счётчик, он его и получил.
Автор: HaK1R
Дата сообщения: 18.05.2009 13:34
KPOBABAK

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

по этому варианту могу предложить конвертонуть в ехе-шник с помощью http://de.newestsoft.com/Windows/Development/Compilers-Interpreters/Bat-To-Exe-Converter_2766_1.html там при конвертировании можно поставить скрытый режим, тогда проверка будет только в процессах висеть, а ее видать. а чтобы процесс не завершали можно удалить диспетчер задач, а лучше не удалять а переименовать его в какойнибудь текстовый файл, а при нужде обратно переименовывать.

И еще может будет лучше не так чтобы он проверял каждую минуту, а чтобы он один раз при запуске проверил, вычислил разницу сколько осталось до выключения, и поставил на паузу, а потом без проверок его выключил, а то если юзеры умные они могут время поменять, когда к концу будет близиться сессия, а так у них будет шанс сделать это только при запуске
Автор: basstard
Дата сообщения: 18.05.2009 13:36
01MDM

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

Код: @echo off
setlocal enabledelayedexpansion
set /a filecount=0
set CHEKFILE=not_exist
FOR /L %%a IN (0,1,9) DO (
    for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
        FOR /L %%c IN (0,1,9) DO (
            FOR /L %%d IN (0,1,9) DO (
                FOR /L %%e IN (0,1,9) DO (
                    FOR /L %%f IN (0,1,9) DO (
                        if exist "<путь>\nnn%%a%%b%%c%%d%%e%%f" (
                            set /a filecount=!filecount!+1
                            set CHEKFILE=!CHEKFILE!,nnn%%a%%b%%c%%d%%e%%f
                            if !filecount!==1 (
                                set CHEKFILE=nnn%%a%%b%%c%%d%%e%%f
                            )
                        )
                    )
                )
            )
        )
    )
)
for %%i in (!CHEKFILE!) do (
    echo %%i
)
pause
Автор: ScreamWolf
Дата сообщения: 18.05.2009 13:43
king_stiven
basstard
А можно ли показывать в окне обрабатываемое значение, а то тупо чернуй экран и все...
Ну если конечно @echo off не прописывать в начале, то видно, но примитивно...


и

Цитата:
FOR /L %%a IN (0,1,9) DO (
for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z ) do (
FOR /L %%c IN (0,1,9) DO (
FOR /L %%d IN (0,1,9) DO (
FOR /L %%e IN (0,1,9) DO (
FOR /L %%f IN (0,1,9) DO (
if exist nnn%%a%%b%%c%%d%%e%%f команда
)
)
)
)
)
)


и

Цитата:
@echo off
setlocal enabledelayedexpansion
FOR /L %%a IN (0,1,9) DO (
for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
FOR /L %%c IN (0,1,9) DO (
FOR /L %%d IN (0,1,9) DO (
FOR /L %%e IN (0,1,9) DO (
FOR /L %%f IN (0,1,9) DO (
if exist "<путь>\nnn%%a%%b%%c%%d%%e%%f" (
set CHEKFILE=nnn%%a%%b%%c%%d%%e%%f
)
)
)
)
)
)
)
echo !CHEKFILE!
pause


...перебор работает... но 01MDM выразился верно:

Цитата:
при следующем запуске батника пропустить уже обработанные файлы:

и его предложеный код так же неплохо работает...

еще не много дополню свою просьбу:

Цитата:
ВОТ УСЛОВИЕ
некая перменная CHEKFILE=nnnXmYYYY
где:
"n" - это латинские буквы (значение постоянное)
"X" - это цыфра от 1 до 9
"m" - это латинские буквы от "a" до "z"
"Y" - это число от 0000 до 9999


nnn - может принимать любые значения, т е у меня файлы типа:
akl4b8950
kmd8c9583
kvu2l9573
и т д

перебор нужен везде кроме первых 3х латинских букв...

и еще

моя ошибочка, забыл указать что YYYY имеет свое начало с двухзначного числа - от 01 до 9999... вот...

king_stiven

Цитата:
да, findstr ом лучше.Просто человек просил счётчик, он его и получил


ОГРОМНОЕ СПАСИБО за счетчик! он мне пригодиться...
а вот FINDSTR может и подходящее решение, но у меня дерево каталогов, но решение о пропуске (создание лог-файла) это очень даже хорошо...

Добавлено:
У меня еще есть вопрсик маленький...

как батником отключить имеющиеся Dial-Up соединение не зная его имени?



Код: rasdial >dial.log

::а как теперь при помощи for'а вытащить первую строку из dial.log и засунуть в set dial=

rasdial %dial% /disconnect
Автор: king_stiven
Дата сообщения: 18.05.2009 13:59
ScreamWolf
Ну вот, с этого и надо было начинать что нужно пройтись по каталогу и всем его подкаталогам в которых... а если ты далее подробно распишешь что и где лежит и какого вида файлы то помочь тебе будет гораздо проще и быстрее.
Автор: ScreamWolf
Дата сообщения: 18.05.2009 14:12
king_stiven
ну то что внутри смысла не имеет... в глобальном каталоге (где собственно и есть начало) имеються каталоги с именами дат (формата DD.MM.YYYY) в каждом каталоге имеются каталоги с именами тайм (формата HH.MM) и уже по ним раскинуты файлики с именами типа: akl4b8950 kmd8c9583 kvu2l9573 (без расширения!)

и вот еще что...

Цитата:
FOR /L %%a IN (0,1,9) DO (
for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z ) do (
FOR /L %%c IN (0,1,9) DO (
FOR /L %%d IN (0,1,9) DO (
FOR /L %%e IN (0,1,9) DO (
FOR /L %%f IN (0,1,9) DO (
if exist nnn%%a%%b%%c%%d%%e%%f команда
)
)
)
)
)
)

при удовлетворении условия перебора мне необходимо выполнить ряд команд (создание батника и последующий вызов через CALL - не предлагать), вот думаю тупо перейти по goto но тогда опять встает вопрос! как мне снова вернуться на то место, на чем остановился?
Есть ли возможность после удовлетворения поиска результат (найденое значение) сунуть в SET?
Автор: king_stiven
Дата сообщения: 18.05.2009 14:26
Хорошо, такой вопрос могут встретиться файлики другого вида? В каждой подпапочке какого вида файлы могут попасться(пример)? Ну сделали мы с ними эти действия. что ты говоришь. это нетрудно, составили мы список D:\temp\akl4b8950 D:\temp\1kmd8c9583 D:\temp\1\kvu2l9573. Могут быть одновременно файлы вида akl4b8950 и akl2c5550? Считай день ты потерял.
Автор: KPOBABAK
Дата сообщения: 18.05.2009 14:28

Цитата:
HaK1R


Спасибо за ссылку. Но насчет изменения времени беспокоиться не стоит. На серваке время менять они не могут. А как все таки насчет варианта кода, который висит в шулдере и делает логоф не тому пользователю из под которого запущен, а другим (терминальные сессии) при условии, что они не в определенной привилегированной группе?
Автор: ScreamWolf
Дата сообщения: 18.05.2009 14:34
king_stiven
кроме указаных файлов по маске nnnXmYYYY, может встретиться если только desktop.ini (attrib -h) думаю он не помеха!...

Добавлено:
и, кстати, по поводу соединений dial-up

Цитата:
У меня еще есть вопрсик маленький...

как батником отключить имеющиеся Dial-Up соединение не зная его имени?



Код:rasdial >dial.log

::а как теперь при помощи for'а вытащить первую строку из dial.log и засунуть в set dial=

rasdial %dial% /disconnect


но это лишь на одно подключение, а если их несколько? как все имеющиеся подключения воткнуть в set?



Добавлено:
king_stiven

структура примерно следующая:

Код:
E:.
| nnn.log
| Перебор.bat
|
+---01.05.2009
| +---10.00
| | gnn1a9998
| | nga1a1090
| | uuj1b6532
| |
| +---11.00
| | cvc6b6362
| | nwr1a9098
| | sdf1a1000
| |
| \---12.00
| icl5f9541
| mnj4z8465
| ocl4k5485
|
+---02.05.2009
| +---10.00
| | jfy8s9400
| | kfj6d8409
| | mav5c6788
| |
| +---11.00
| | mau1l5598
| | mck9z7777
| | pow3k6689
| |
| \---12.00
| mmk8d8229
| ofl4j7529
| prk5j5630
|
\---03.05.2009
+---10.00
| dpp3o5900
| sts2i8922
| wex4i6678
|
+---11.00
| mcd3o5959
| vmu5c0843
| xii4u1198
|
\---12.00
aqq3d5000
tls4z5036
vii9f8765
Автор: basstard
Дата сообщения: 18.05.2009 14:59
ScreamWolf
по поводу соединений dial-up

если лог нужен только чтобы узнать имена подключений,
то лог не нужен:

Код: @echo off
setlocal enabledelayedexpansion
set /a entrycount=0
for /f "skip=1 delims=" %%i in ('rasdial') do (
    set /a entrycount=!entrycount!+1
    if !entrycount!==1 (
        set entryname=%%~i
    )
)
echo !entryname!
pause
Автор: ScreamWolf
Дата сообщения: 18.05.2009 15:09
basstard


Цитата:
а если их несколько
заскриншоть или напиши что именно возвращает rasdial


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

А так! СПАСИБО большое за помощь...
Автор: basstard
Дата сообщения: 18.05.2009 15:18
ScreamWolf
с такой структурой разумнее сначала определить
список всех файлов, а потом, если это необходимо,
проверить соответствие названия.
поэтому вопрос: 1. на диске e:\ есть лишние файлы/папки,
2. в нужных папках есть лишние файлы?
Автор: ScreamWolf
Дата сообщения: 18.05.2009 15:29
basstard
1
на диске есть еще куча разных каталогов и файлов
2
в нужных каталогах нет лишних файлов и каталогов...

могут присутствоватть пустые каталоги

а папки типа DD.MM.YYYY - все они находяться в одном каталоге!
Автор: basstard
Дата сообщения: 18.05.2009 15:52
ScreamWolf
на диске есть еще куча разных каталогов и файлов
попробуй тогда вот так:

Код: @echo off
setlocal enabledelayedexpansion
set /a filecount=0
set filelist=not_exist
for /l %%a in (0,1,3) do (
    for /l %%b in (0,1,9) do (
        for %%c in (0,1) do (
            for /l %%d in (0,1,9) do (
                if exist e:\%%a%%b.%%c%%d.2009 (
                    for /r e:\%%a%%b.%%c%%d.2009 %%i in (*) do (
                        set /a filecount=!filecount!+1
                        set filelist=!filelist!,%%i
                        if !filecount!==1 (
                            set filelist=%%i
                        )
                    )
                )
            )
        )
    )
)
for %%j in (!filelist!) do (
    echo %%j
)
pause
Автор: HaK1R
Дата сообщения: 18.05.2009 18:01
KPOBABAK
не совсем уверен что я тебя понял, но может это

Код: shutdown -s -m \\Comp -t 0
Автор: king_stiven
Дата сообщения: 18.05.2009 18:39
basstard
ScreamWolf
Если я скажу, ерундой не занимайтесь, это будет не слишком?

Код: @echo off
for /f "tokens=*" %%c in ('dir /b /s /a:-d ^| findstr [a-z][a-z][a-z][0-9][a-z][0-9][0-9]*') do (
а здесь с каждым из найденных файлов можно сделать всё, что угодно: сравнить со списком из nnn.log, узнать имя папки, где лежит файл, скопировать, создать папки с именем файла и т д и т п
)
del /q nnn.log
dir /b /s /a:-d | findstr [a-z][a-z][a-z][0-9][a-z][0-9][0-9]*>> nnn.log
Автор: basstard
Дата сообщения: 18.05.2009 19:18
king_stiven
Ох.. смотрю на эту красоту (правда красиво) и думаю: ну почему же я так
боюсь и избегаю findstr и перенаправления вывода..
и понял почему — из-за непредсказуемости результата:
в твоем примере, если где-нибудь на диске окажется безобидная папка myd0c25,
например c:\documents\myd0c25, то все ее содержимое и всех ее подкаталогов
будет успешно обработано например, удалено ..или отправлено начальству
Автор: king_stiven
Дата сообщения: 18.05.2009 19:41
basstard

Цитата:
кроме указаных файлов по маске nnnXmYYYY, может встретиться если только desktop.ini (attrib -h) думаю он не помеха!...


Цитата:
в глобальном каталоге (где собственно и есть начало) имеються каталоги с именами дат (формата DD.MM.YYYY) в каждом каталоге имеются каталоги с именами тайм (формата HH.MM) и уже по ним раскинуты файлики с именами типа: akl4b8950 kmd8c9583 kvu2l9573 (без расширения!)

Можно ещё провести проверку этих файлов на имя папки где они лежат (формата HH.MM) , а также на имя родительской папки папки где они лежат (формата DD.MM.YYYY), или же проверку на количество родительских папок до корня диска и при превышении двух как в данном случае. файл не учитывать, много вариантов. С другой стороны мы не знаем его комп. а он уверен. что ненужных файлов не наберём. тогда зачем усложнять?
Автор: basstard
Дата сообщения: 18.05.2009 20:21
king_stiven
я бы findstr'у все-равно не доверил: представь, если придется запустить с системного диска:
из логов как-раз и узнаешь, сколько интересных названий скрывалось в папке c:\windows
зато вывод dir'а в переменную очень понравился, еще и по аттрибутам можно,
а то всегда, когда нужно папку от файла отличить, приходится вот так делать:
cd <путь> && (echo это Папка!)
cd <путь> || (echo а это не папка!)
вот теперь буду сразу в цикл их вбрасывать
Автор: HaK1R
Дата сообщения: 18.05.2009 20:55
что то флуда много, перестал понимать ваш разговор
basstard
А что сделать то тебе надо?
Автор: guru431
Дата сообщения: 19.05.2009 10:13
Как стандартными средствами Windows сделать так, чтобы в батнике не выводилось никаких сообщений (команды, результаты выполнения, ошибки)?

Вот мой вариант:
@echo off
echo wait
del /f /s /q "%Temp%\*" > nul

Команды и результаты выполнения не выводятся, но ошибки всё равно появляются:
"Процесс не может получить доступ к файлу..."
"Не удается найти указанный файл."

PS: cmdow по ряду причин не подойдет
Автор: 01MDM
Дата сообщения: 19.05.2009 10:33

Код:
del /f /s /q "%Temp%\*" 1>nul 2>&1
Автор: TruLander100
Дата сообщения: 19.05.2009 10:35
Добрый день!)
Прошу помощи написания скрипта
Суть такова: нужно чтоб при его запуске он предлогал ввести данные для заполнения формы
(есть файл в нем собран шаблон, нужно заменить вводимыми данными заранее заготовленые слова они в скобках пример ниже)
введите название (Zagolovok)
введите свои данные в ipicture (akkount)
введите название файла скрина (Filenamescrin)
введите название компании разработчика (Razrabotchic)
введите платформу (platform)
введите языки (Language)
введите размер(sizi)
введите описание(Opisanie)
введите ссылку(ssilka)
Пример файла

Код: [html] <div align="center"><span style="font-size: medium">
<strong>Zagolovok </strong>
</span></div><table height="222" width="750"><tbody><tr><td valign="top">
<strong><span style="color: #000080">Скинсейвы:</span></strong></td>
<td> [lightbox=http://pic.ipicture.ru/uploads/akkount/Filenamescrin|
|]
[/lightbox] </td></tr><tr><td> <span style="color: #000080">
<strong>Разработчик:</strong></span></td><td> Razrabotchic</td></tr><tr>
<td> <span style="color: #000080"><strong>Платформа:</strong></span>
<br /></td><td> platform</td></tr><tr><td> <span style="color: #000080">
<strong>Язык:</strong></span></td><td> Language</td>
</tr><tr><td> <span style="color: #000080"><strong>Размер:</strong></span></td>
<td> <strong>sizi</strong></td></tr><tr><td valign="top">
<span style="color: #000080"><strong>Описание:</strong></span></td>
<td> Opisanie</td></tr><tr><td>
<span style="color: #ff0000"><strong>Скачать:</strong></span></td><td>
<a href="ssilka" rel="external" title="скачать">
<span style="color: #ff0000">Depositfile</span></a></td></tr></tbody>
</table> [/html]

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: SAS.Планета (часть 2)


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