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

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

Автор: igor_andreev
Дата сообщения: 01.07.2006 12:00
cluster
Миранды у меня нет, толком проверить не могу, но попробуй так

Код:
@ECHO OFF

IF EXIST +RESULT.LOG DEL +RESULT.LOG

FOR %%A IN (*.TXT) DO (
CALL :FIND_USERNAME %%A
CALL :FIND_UIN %%A
IF DEFINED USER IF DEFINED UIN (
REM Если %USER% и %UIN% заданы, вызываем
REM соответствующую метку батника и записываем их
CALL :WRITE_USERNAME_AND_UIN
) ELSE (
REM Иначе сбрасываем переменные %USER% и %UIN%
SET USER=
SET UIN=
)
)

GOTO :EOF


:FIND_USERNAME
FOR /F "TOKENS=2 DELIMS=:" %%I IN ('FIND "User" "%*"') DO (
REM Если не задана переменная USER, то присваиваем USER
REM первому же найденному и выходим из цикла FOR,
REM дальше этот файл не читаем
IF NOT DEFINED USER (SET USER=%%I && GOTO :EOF)
)
GOTO :EOF

:FIND_UIN
FOR /F "TOKENS=2 DELIMS=:" %%I IN ('FIND "UIN" "%*"') DO (
REM Если не задана переменная UIN, то присваиваем UIN
REM первому же найденному и выходим из цикла FOR,
REM дальше этот файл не читаем
IF NOT DEFINED UIN (SET UIN=%%I && GOTO :EOF)
)
GOTO :EOF

:WRITE_USERNAME_AND_UIN
REM Записываем в лог
ECHO %USER% - %UIN% >> +RESULT.LOG
REM И сбрасываем переменные %USER% и %UIN%
SET USER=
SET UIN=
GOTO :EOF
Автор: cluster
Дата сообщения: 01.07.2006 14:02
igor_andreev
всё работает. пасипа!
я так и не понял, почему твой скрпт не ругается на имя файла с пробелами, а у evle ругается..
Автор: evle
Дата сообщения: 01.07.2006 18:47

Цитата:
твоя маска работает только в кавычках..

У меня всё работает так, как было.

Цитата:
а вот это не помогает! он спотыкается на имени файла, а не на имени в icq (USER)

У меня длинные имена обрабатываются правильно именно после добавления кавычек в find:
[more]
G:\Testing\text>dir /b
1.txt
2 1.txt
test.cmd

G:\Testing\text>test
Не удается найти G:\Testing\text\res

G:\Testing\text>dir
Том в устройстве G имеет метку Data
Серийный номер тома: 5893-1B21

Содержимое папки G:\Testing\text

01.07.2006 23:41 <DIR> .
01.07.2006 23:41 <DIR> ..
30.06.2006 13:57 286 1.txt
30.06.2006 14:08 281 2 1.txt
01.07.2006 23:41 53 res
01.07.2006 23:38 222 test.cmd
4 файлов 842 байт
2 папок 38 198 906 880 байт свободно

G:\Testing\text>type res
User: 111
UIN: 246281652
User: 222
UIN: 2164

G:\Testing\text>type test.cmd
@echo off
del res
for %%q in (*.txt) do (
for /f "tokens=2 delims=: skip=1" %%i in ('find "User" "%%q"') do echo U
ser:%%i >> res
for /f "tokens=2 delims=: skip=1" %%i in ('find "UIN" "%%q"') do echo UI
N:%%i >> res
)
G:\Testing\text>
[/more]
Что я делаю не так?

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

Протестировал конструкцию. Результат: работает, но толку нет. Дело в том, что find в любом случае ищет текст по всему файлу и for начинает работать только после того, как find уже выдал все результаты. Таким образом пока используется команда find, каждый файл просматривается столько раз, сколько раз она применяется. Остальное работает гораздо быстрее и нет смысла это учитывать.
Да, заметил, что строчка с "find "Protocol"" в батнике совершенно лишняя, можно просто "echo --- >> ..."



Добавлено:
Если кому интересно, методика тестирования:
[more]
--- make.cmd ---
@echo off
del /q bigfile
del /q tmp
for /L %%i in (0,1,10000) do echo str >> bigfile
for /L %%i in (0,1,10) do ( copy bigfile+bigfile tmp & del /q bigfile & ren tmp bigfile)
echo str1 >> tmp
copy tmp+bigfile tmp2
del /q tmp
ren tmp2 bigfile
--- test.cmd ---
@echo off
echo %time%
for /F %%i in ('find "str1" bigfile') do (
rem kfjdlfj
)
echo %time%
for /F %%i in ('find "str1" bigfile') do ( goto end )
:end
echo %time%
------
[/more]
Автор: mikolamkn
Дата сообщения: 02.07.2006 15:38
как заменить путь в конкретной строке- (это текстовый файл)?
Public = C:\ффф\ччч\crypt\1111\public.key
Secret = С:\ффф\ччч\crypt\1111\secret.key
AddValue = -c -wt:
Message = C:\ффф\ччч\out

на

ublic = C:\ффф\ччч\crypt\1111\public.key
Secret = A:\ффф\ччч\crypt\1111\secret.key
AddValue = -c -wt:
Message = C:\ффф\ччч\out

помогите не получается.

вот программулина
@echo on
cls
pushd E:\Cl_bank\CRYPT\
for /D %%i in (*) do md a:\crypt\%%i
for /D %%i in (*) do copy /Y "E:\Cl_bank\CRYPT\%%i\CFG.CFG" a:\crypt\%%i\*.*
for /D %%i in (*) do copy /Y "E:\Cl_bank\CRYPT\%%i\secret.key" a:\crypt\%%i\*.*
rem for /D %%i in (*) do del C:\Quorum\Cl_bank\CRYPT\%%i\secret.key

for /D %%i in (*) do rename a:\crypt\%%i\cfg.cfg cfg1.cfg
for /D %%i in (*) do for /f "tokens=* delims=" %%a in ('more^<a:\crypt\%%i\cfg1.cfg') do call :_replace %%a
goto eof
:_replace
set i=%*
echo %i %
for /D %%i in (*) do set i=%i:C:\quorum\cl_bank\crypt\%%i\secret.key=A:crypt\%%i\secret.key%

for /D %%i in (*) do echo %i%>>a:\crypt\%%i\cfg.cfg
rem for /D %%i in (*) do del a:\crypt\%%i\cfg1.cfg
for /D %%i in (*) do copy /Y a:\crypt\%%i\cfg.cfg c:\quorum\cl_bank\crypt\%%i\cfg.cfg
goto eof
popd
:eof

конкретно не работает вот эта строка
for /D %%i in (*) do set i=%i:C:\quorum\cl_bank\crypt\%%i\secret.key=A:crypt\%%i\secret.key%

конкретно не понимает запись C:\quorum\cl_bank\crypt\%%i\secret.key=A:crypt\%%i\secret.key

если записать так, то работает

for /D %%i in (*) do set i=%i:C:\=A:\%


как быть?


Добавлено:
за ранее спасибо

Добавлено:
хелп.
Автор: dimonvortex
Дата сообщения: 03.07.2006 13:53
Господа, требуется помощь спецов.
windows xp
Ситуация такая, нужен bat-ник, который удаляет программу.
При этом не просто стирает папку, а сносит её из системы (т.е. повторяет действия установка/удаление программ windows).

Например:

Есть программа AVP Administration kit.
Своего uninstall.exe у него нет, но при этом она прописана в системе (установка/удаление программ).

Вопрос, как путём bat-ника её полностью убить???
Автор: bredonosec
Дата сообщения: 03.07.2006 15:02

Цитата:
, но при этом она прописана в системе (установка/удаление программ).
- вариант 1
сделать кадр реестра до инсталла и после (регшот, регснап), потом разницу собрать в рег-файлик и перед значениями двордов/регов просто добавить минус ("-")
в батнике же прописать команды удаления папки + запуск рег-файла вышеуказанного.
вариант 2
(если нет возможности/желания инсталлить прогу) - тогда каким-нить reg-cleaner-ом, напр, jv16, открыть реестр, найти ключи этой проги, экспортнуть, потом отредактить рег-файлик (добавить минус), далее второй шаг без изменений..

rmk //минус перед значением параметра в рег-файле удаляет указанное из реестра//
Автор: evle
Дата сообщения: 03.07.2006 16:39
mikolamkn
Категорически не понимаю, что по-твоему должна делать строка

Цитата:
for /D %%i in (*) do set i=%i:C:\=A:\%

А тем более

Цитата:
for /D %%i in (*) do set i=%i:C:\quorum\cl_bank\crypt\%%i\secret.key=A:crypt\%%i\secret.key%

Объясни на пальцах, что ты хочешь получить.
Автор: Allex_Van_Fogen
Дата сообщения: 04.07.2006 04:31
Из cmd скрипта определить админ/юзер:


Код:
net user %USERNAME%|find /I "Administrators">NUL
if errorlevel 1 (echo User %USERNAME% in Users group) else (echo User %USERNAME% in Administrators group)
Автор: 01MDM
Дата сообщения: 04.07.2006 09:28
Подскажите пожалуйста, как можно проверить наличие %1 %2 и %3

есть небольшой батник для переименования группы файлов в каталоге:


Код:
@ECHO OFF

setlocal enabledelayedexpansion
set A=0
for %%I in ("%1") do (
    set /a A=!A!+1
    if !A! geq 100 (ren %%I %2[!A!].%3
    ) else (
    if !A! geq 10 (ren %%I %2[0!A!].%3
    ) else (
    ren %%I %2[00!A!].%3
    )
)    
)
endlocal

echo all of files are renamed

Автор: Kirillhome
Дата сообщения: 04.07.2006 11:04
01MDM

Цитата:
Надо проверить введены-ли эти самые %1 %2 и %3

if not defined %3 (соответственно если существует %3, значит есть и %1 и %2) не работает
Что делать?


Если не ошибаюсь, конструкция типа

If "%3%"=="" (
Echo Не введен 3-й параметр, работать - отказываюсь!
GOTO EOF
) else (
Echo 3-й параметр введен, будем работать...
GOTO PROD
)
Автор: 01MDM
Дата сообщения: 04.07.2006 12:46
Kirillhome

Большое спасибо! Работает. Не поймешь когда и как ставить проценты и восклицательные знаки. УЖООС!
Автор: Aroun
Дата сообщения: 04.07.2006 18:34
Здраствуйте!
Вопрос в следующем.Надо шоб юзверь мог запускать прогу, которя может запускаться только с правами админа. Причем юзверь должен не знать пароль а только щелкать по батнику и прга должна запускаться.
Что было сделанов этом направлениии:
Активно юзался schtasks, с ключом /run, но происходит инетерснасная фишка-вроде привыполнении пишет-успех и процесс мля появляется в диспетчере, но прога не работает...
Что такое не везет и как с ним бороться?
Автор: bredonosec
Дата сообщения: 04.07.2006 19:11

Цитата:
Причем юзверь должен не знать пароль а только щелкать по батнику и прга должна запускаться.
- а ярлык на запуск с уже вписанными логином и паролем админа не годится? (/runas)
Автор: Aroun
Дата сообщения: 04.07.2006 19:34
Нет.Runas не сохраняет пароль, точнее там только учетка прописывается а пароль вбивать надо.
Автор: bredonosec
Дата сообщения: 04.07.2006 19:41
Aroun
вариант
7.5. Моя любимая программа работает только под аккаунтом администратора Как сделать, чтобы она работала и под аккаунтом обычного пользователя? Updated
не подходит? (в смысле, импорт ветки реестра и т.д.)
Автор: Aroun
Дата сообщения: 04.07.2006 19:46
Будем пробовать...

Добавлено:
Неа. Я просто не могу щас в реале попробовать-на работе.Решил смоделировать:взял из программ филес ехешник и вручную закрыл к нему доступ всем кроме моей учетки и перелогинился в другую(тоже админскую). Сделал все в реестре-результата-ноль((

Добавлено:
Неа. Я просто не могу щас в реале попробовать-на работе.Решил смоделировать:взял из программ филес ехешник и вручную закрыл к нему доступ всем кроме моей учетки и перелогинился в другую(тоже админскую). Сделал все в реестре-результата-ноль((
Автор: bredonosec
Дата сообщения: 04.07.2006 21:16

Цитата:
и вручную закрыл к нему доступ всем кроме моей учетки
- так среди указанного упоминалось при необходимости открыть доступ к указанной проге (ветке, экзешнику)..
Автор: evle
Дата сообщения: 05.07.2006 09:02
Aroun

Цитата:
Runas не сохраняет пароль, точнее там только учетка прописывается а пароль вбивать надо.

Если очень хочется, то сохраняет.

Код:
runas /savecred /user:admin program
Автор: Aroun
Дата сообщения: 05.07.2006 14:41

Цитата:
Aroun Цитата: Runas не сохраняет пароль, точнее там только учетка прописывается а пароль вбивать надо. Если очень хочется, то сохраняет. Код:   runas /savecred /user:admin program

Ну вот это наверно пойдет, пасиб, юзверь не сможет запускать проги потому как ярлыков на них нет, ситемные папки скрыты, а до запуска из командной строки ему как до бога(на то он и юзверь)
Автор: 01MDM
Дата сообщения: 05.07.2006 15:45
Aroun


Цитата:
(на то он и юзверь)


Ну-ну, юзверь он только прикидывается, а когда надо... Убери пункт "Выполнить" (реестр) и выставь права на cmd.exe, cacls /?
Автор: Aroun
Дата сообщения: 05.07.2006 18:03
Еще вопрос:
как создать папку/файл с сегодняшней датой?
Автор: Yuk
Дата сообщения: 05.07.2006 18:58
Aroun
Вроде уже было.
для папки:

Код: for /f "tokens=2-4 delims=/ " %%a in ('date /t') do md "%%c%%a%%b"
Автор: vasiliy74
Дата сообщения: 06.07.2006 12:37
суть такая постоянно проводятся обновления, но скопированные файлы в дирикторию при обновлении удоляются, можно ли как либо сохранять их перечень в лог и при последующем обновлении не копировать их??
Автор: bredonosec
Дата сообщения: 07.07.2006 03:59

Цитата:
можно ли как либо сохранять их перечень в лог и при последующем обновлении не копировать их??
мысльь такая, проверять перед копированием на
if exist..., then...
Автор: vasiliy74
Дата сообщения: 07.07.2006 06:39

Цитата:
if exist..., then...

а дальше? что то не совсем наверно описал суть проблемы, файлов много, нужно каким либо способом их перечень зиписывать в файл и при повторном обращении на копироание проверят имеются ли они в списке или нет, если есть то копировать их не стоит эти мы увеличиваем скорость постоянного обновления.
Автор: abz
Дата сообщения: 07.07.2006 10:58
vasiliy74

Вот как это реализовано у меня:

Код: xcopy /d /y "C:\Documents and Settings\All Users\Application Data\Kaspersky Lab\AVP6\Bases\*.*" B:\Aids\Bases\
Автор: cluster
Дата сообщения: 07.07.2006 14:26
как можно организовать батник, который будет сообщать при запуске:
Файл с именем %name% найден.

--
Где %name% - только имя файла без расширения!
скажем, какой-то пользователь работает в программе. А программа создаёт временный файл (неважно какой, например treb.err). Так вот, нужно, чтобы батник вывел:
Файл с именем treb найден.
Автор: KapralBel
Дата сообщения: 07.07.2006 14:33
cluster
Т.е надо вывести сообщение если имеется любой файл с заданным именем, но любым расширением?
Автор: 01MDM
Дата сообщения: 07.07.2006 14:58
Как в переменную записать результат выполнения другой программы или команды?
Вариант с обратными кавычками не работает.

например

Код:
set var=`date /t`
echo %var%

выводится:

`date /t`
Автор: KapralBel
Дата сообщения: 07.07.2006 15:08
01MDM
Тебе нужно записать результат любой программы или конкретной date /t
Если только date /t
то попробуй
Set var=%Date%

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Вернуть библиотеку АТМ (поддержка шрифтов Type 1)


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