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

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

Автор: Mark_Titov
Дата сообщения: 08.05.2010 17:56
...Кто подскажет почему не работает перекодировка?



Код: @echo off
if [%2]==[] (
echo Convert win1251 to dos866
echo Usage: win2dos input.file output.file
exit /b 1
)
set out=%2
chcp 1251 >nul
for /f "tokens=*" %%a in (%1) do call :convert %%a
goto :eof

:convert
chcp 866 >nul
echo %*>>%out%
chcp 1251 >nul
Автор: soft111
Дата сообщения: 08.05.2010 20:20
У меня еще вопрос , помогите пожалуйста:
Например в 1.txt указано число 15, значит bat файл считывает число из 1.txt и копирует текстовый файл с таким же числом в названии (т.е. 15.txt)
Если через bat файл не возможно такое подскажите какую нибудь программу для этого или скрипт.
Автор: Mark_Titov
Дата сообщения: 08.05.2010 22:36
Помогите пож-ста кусочком кода...
Нужно сделать на батник пароль.

ЦЕЛЬ-
Сделать в батнике что бы при запуске он проверял на удаленной машине СОДЕРЖИМОЕ текстового файлика (это будут только цифры мин 4 макс 6 цифр), далее запрашивал ввести эти цифры не показывая их на экране и при совпадении введенных цифр и содержимого текстового файлика - команды выполняются дальше, при НЕ совпадении их - команда EXIT.
Путь к файлу такой -

Код: \\terminal_1\c$\WINDOWS\addins\pass.txt
Автор: BorlandIMHO
Дата сообщения: 08.05.2010 22:44
METAJIJI
Тогда блок вывода выглядит где-то так:
Код: copy /y nul out.ini
for /f "eol=# tokens=1,2 delims==" %%A in (my.ini) do 1>>out.ini (
REM если строка - название секции - просто выводим её в новый файл. Признак - символ "["
echo %%A|find "["
REM закомментированная строка. Признак - символ ";"
echo %%A=%%B|find ";"
REM Строки с изменяемыми переменными. По одному эху на каждую изменяемую переменную. Или вообще на каждую, что эффективнее (см. ниже)
echo %%A=%abc% |find /V ";"|find /V "["|find /I "abc="
echo %%A=%val% |find /V ";"|find /V "["|find /I "val="
echo %%A=%qwerty% |find /V ";"|find /V "["|find /I "qwerty="
echo %%A=%zxc% |find /V ";"|find /V "["|find /I "zxc="
REM Остальные строки с переменными. По одному блоку |find /V на все переменные, выведенные выше. Если есть полная уверенность, что выведены все используемые переменные - эта команда не нужна! Лучше обойтись без неё в силу громоздкости (подозреваю, что и работать она будет сильно долго, если переменных сильно много)
echo %%A=%%B |find /V ";"|find /V "["|find /V "abc=" |find /V "val="|find /V "qwerty="|find /V "zxc="
)
Автор: METAJIJI
Дата сообщения: 08.05.2010 23:07
А пустые строки будут выводиться?

Код: val=

abc=
Автор: wolf0425
Дата сообщения: 09.05.2010 02:48
Mark_Titov
Цитата:
ТАК ВОТ КАК ЗАСТАВИТЬ ЕГО СЧИТЫВАТЬ ПО УКАЗАННОМУ ПУТИ, И СРАВНИВАТЬ ЭТИ ДАННЫЕ???

1. не капси, читать противно.
2. сравнить две переменные сам сможешь?
3. чтение строки из файла в переменную было например на предыдущей странице.

альтернативное решение - с помощью findstr проверить что в файле есть строка, полностью совпадающая с нужной переменной. справку сам прочитать способен?

Автор: Mark_Titov
Дата сообщения: 09.05.2010 03:02
...Голова уже беременная ))) от этих переменных, но делать нужно.
Думал про findstr, но с переменными туго у меня...
Щас пробовать буду...
Спасибо.
Если что напишу...

Добавлено:
Решение нашел, спасибо с переменными помогли мне...

Код: @echo off
setlocal
set sPath=\\terminal_1\c$\WINDOWS\addins\pass.txt
for /f "usebackq delims==" %%i in ("%sPath%") do set sPassword=%%i
set /p sInPassword=Enter password:
if "%sPassword%" neq "%sInPassword%" exit /b 1
ping 127.0.0.1
pause
endlocal
exit /b 0
Автор: NIKZZZZ
Дата сообщения: 09.05.2010 07:30
Mark_Titov

Цитата:
Только как сделать так что бы данные считывались только с первой строки в файле pass.txt, а все остально игнорировалось?



Код: @echo off
setlocal
set sPath=\\terminal_1\c$\WINDOWS\addins\pass.txt
for /f "usebackq delims==" %%i in ("%sPath%") do (
set sPassword=%%i
goto _1
)
:_1
set /p sInPassword=Enter password:
if "%sPassword%" neq "%sInPassword%" exit /b 1
ping 127.0.0.1
pause
endlocal
exit /b 0
Автор: mbku14
Дата сообщения: 09.05.2010 07:38
Здравствуйте, заранее извините, если вопрос глупый.

Есть bat файл, вызывающий много других bat-файлов, суть которых с помощью команды for построчно разбирать файлы и что-то там делать. Файлы большие где-то по 2000 строк. Вcё это как-то работает.

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

Запускать и работать все должны с этого сетевого диска, но при этом никакого удаленного рабочего стола, а работать со своего компа..

И в результате каждый bat-файл работает минут по 10.
Нельзя ли как-то сделать чтоб работало быстро.

Копировать всё себе на комп перед запуском не пойдет, т.к. не у всех для этого есть место на компе.
Автор: wolf0425
Дата сообщения: 09.05.2010 08:25

Цитата:
Только как сделать так что бы данные считывались только с первой строки в файле pass.txt, а все остально игнорировалось?
тогда for лишний
set /p sPassword=<\\terminal_1\c$\WINDOWS\addins\pass.txt
Автор: Mark_Titov
Дата сообщения: 09.05.2010 09:23
...спасибо, работает!
Но теперь проблемка в связи с этим нарисовалась -
- если удалить файл пароля pass.txt, то в моей консоли можно просто нажать ENTER и без проблем войти в меню.

Нужно к этому коду прикрутить проверку наличия этого файла (pass.txt) и если его нет - надпись типа "SORRY, PASSWORD NO VALID, press any key for exit".
А если файл есть, но пустой, та же надпись - "SORRY, PASSWORD NO VALID, press any key for exit".

Буду очень признателен вам если поможете в этом, уже все практически готова консоль, это последние штрихи по безопасности...

wolf0425 us0r NIKZZZZ
Благодарю вас! Вы очень мне помогли...
Автор: Rush
Дата сообщения: 09.05.2010 10:29
Mark_Titov

Код:
if exist %sPath% (
if "%sPassword%"=="" echo SORRY, PASSWORD NO VALID, press any key for exit
) else (echo SORRY, PASSWORD NO VALID, press any key for exit)
Автор: BorlandIMHO
Дата сообщения: 09.05.2010 10:44
METAJIJI
Цитата:
пустые строки будут выводиться?

Будут.

Цитата:
как быть со строками вида:

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

Код: [GameLog]
X=0
Y=0
XL=512
YL=256
Автор: wolf0425
Дата сообщения: 09.05.2010 11:51

Цитата:
А откуда они вообще взялись? В первоначальной постановке задачи таких не было...

первоначально приведенный код такие строки переваривал, вроде.


Цитата:
Или тогда уже писАть отдельную подпрограмму вывода под каждую используемую переменную,
это ещё зачем? строки как строки - "^<>% нет и ладно.

Цитата:
Правда, если вы такие переменные не изменяете
да и если изменяет - нет никакой проблемы


Цитата:
А ещё проще - поскольку структура данного ini вам известна - просто тупо написать вывод его эхом без всяких циклов...
вот-вот.
в чем смысл что-то извращенно циклить, если все параметры первоначально загоняются в переменные, а потом все переменные загоняются в новый инишник?
разве только комментарии переносить...
Автор: BorlandIMHO
Дата сообщения: 09.05.2010 13:01
wolf0425

Цитата:
и если изменяет - нет никакой проблемы

Подумал. Действительно нету.
Просто на неё надо будет добавить отдельную строчку.

Цитата:
разве только комментарии переносить...

других причин тоже не вижу...

Если уж на то пошло - редактирование ini батником вообще большой изврат...
Автор: Mark_Titov
Дата сообщения: 09.05.2010 14:04
Rush спасибо...
Теперь при отсутствии файла он НЕ открывает меню консоли!

Нужно решить теперь как при наличии файла НО отсутствии в нем пароля тоже что бы не открывался. (если файл есть - но пустой)...
Автор: wolf0425
Дата сообщения: 09.05.2010 14:49

Цитата:
Нужно решить теперь как при наличии файла НО отсутствии в нем пароля тоже что бы не открывался. (если файл есть - но пустой)...
давай вообще устрой проверку первой буквы пароял на букву-цифру, чего мелочиться то
echo.%sPassword%|findstr /i /r /b /c:"[a-z0-9]">nul && goto:goodpass


Добавлено:

Цитата:
Если уж на то пошло - редактирование ini батником вообще большой изврат...
не, пока несколько строк поменять - нет проблем, sed или for+findstr прикручиваем и вперед, с песней, инишник такой же текстовый файл как все прочие.
А нафига ВЕСЬ инишник менять построчно - непонятно.

BorlandIMHO
хотя если кому-то очень хочется - почему нет?

Код: @echo off
for /f "tokens=1* delims==" %%a in (file.txt) do if .%%b neq . set %%a=%%b
del file2.txt
set xx100=1000
for /f "tokens=1* delims=]" %%a in ('find /n /v "" ^<file.txt ') do echo.%%b | find "=">nul && ( for /f "tokens=1 delims==" %%c in ('echo.%%b') do 1>>file2.txt call echo.%%c=%%%%c%%) || (1>>file2.txt echo.%%b)
Автор: Mark_Titov
Дата сообщения: 09.05.2010 15:37

Цитата:
давай вообще устрой проверку первой буквы пароял на букву-цифру, чего мелочиться то
echo.%sPassword%|findstr /i /r /b /c:"[a-z0-9]">nul && goto:goodpass

...а что, это не плохая идея! )

Я не много переделал строку (скомбинировал), по идее должна работать, но почему-то не хочет.


Код: dir \\terminal_1\c$\WINDOWS\addins\pass.txt* /a-d 2>nul >nul| findstr /i /r /b /c:"[a-z0-9]">nul && goto :_menu
goto :_error
Автор: wolf0425
Дата сообщения: 09.05.2010 15:46

Цитата:
по идее должна работать, но почему-то не хочет.

да и по идее работать не должна, тебе только кажется.

Цитата:
По логике этот код должен проверять сначало наличие самого файла,
проверяет,
кстати наличие pass.txt.bak такую проверку устроит
Цитата:
потом проверяет наличие первой буквы или цифры,
покрась синеньким -какое место кода отвечает за отправку содержимого файла на проверку.

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


Код: type \\terminal_1\c$\WINDOWS\addins\pass.txt 2>nul | findstr /i /r /b /c:"[a-z0-9]">nul && goto :_menu
goto :error
Автор: Mark_Titov
Дата сообщения: 09.05.2010 16:20

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

...Действительно )) не подумал что-то...
Большое человеческое спасибо тебе и остальным гуру командной строки которые мне помогали в этом...

P.s.
Я знаю что cmd не поддерживает *** звездочки, а можно как-нибудь скрыть ввод паролей в консоль?

И еще, этот код будет на vista и 7-ке работать? Сам на XP сижу, пока не переходил еще, да и под рукой их нет - не могу проверить...

Спасибо за помощь...
С уважением...
Автор: wolf0425
Дата сообщения: 09.05.2010 16:48

Цитата:
Я знаю что cmd не поддерживает *** звездочки, а можно как-нибудь скрыть ввод паролей в консоль?
вроде нет. а от чего конкретно должны защищать звездочки? от наблюдательного человека стоящего за спиной?
Автор: Mark_Titov
Дата сообщения: 09.05.2010 17:02

Цитата:
от наблюдательного человека стоящего за спиной?

...Да.

Может как-нибудь что бы он команды введенные с клавы понимал, но просто не показывал их?

Этот код будет на vista и 7-ке работать?

Спасибо за помощь...
С уважением...
Автор: soft111
Дата сообщения: 09.05.2010 17:23
Помогите пожалуйста с написанием батника под такое дело:
Например в 1.txt указано число 15, значит bat файл считывает число из 1.txt и копирует текстовый файл с таким же числом в названии (т.е. 15.txt)
Если через bat файл не возможно такое подскажите какую нибудь программу для этого или скрипт.
Автор: Rush
Дата сообщения: 09.05.2010 17:48
soft111
А что, в том файле кроме цифры ничего нет? Тогда примерно так:

Код: @echo off
set /p n=<x:\1.txt
copy x:\%n%.txt x:\Temp
Автор: METAJIJI
Дата сообщения: 09.05.2010 18:15

Цитата:
А нафига ВЕСЬ инишник менять построчно - непонятно.

Подскажите как тогда НЕ построчно средствами BATCH изменить значения? с sed очень заманчиво конечно...
Но:
1. как сделать поиск НЕ чувствительный к регистру.
2. как быть с переменными типа var=123 и gvar=123, ;var=123 и т.д. (мне нужно изменять только var)

Спасибо всем за помощь
Автор: wolf0425
Дата сообщения: 09.05.2010 19:07

Цитата:
Подскажите как тогда НЕ построчно средствами BATCH изменить значения? с sed очень заманчиво конечно...
Но:
1. как сделать поиск НЕ чувствительный к регистру.
i в параметре команды

Цитата:
2. как быть с переменными типа var=123 и gvar=123, ;var=123 и т.д. (мне нужно изменять только var)
включить начало строки в поиск.

Код: sed "s/^(var=).*$/\1%var%/gi" <file.txt >file2.txt
Автор: Rush
Дата сообщения: 09.05.2010 19:09
METAJIJI

Цитата:
2. как быть с переменными типа var=123 и gvar=123, ;var=123 и т.д. (мне нужно изменять только var)

По моему, это очевидно - ставишь символ начала строки перед var и все.



Добавлено:
припозднился...
Автор: king_stiven
Дата сообщения: 09.05.2010 20:12
METAJIJI
Может не в тему, есть такой файлик INIFILE.COM. К нему в батнике прописываешь:
Syntax: INIFILE inifile_name [section] item=
Syntax: INIFILE inifile_name [section] /remove

Ну и ещё там функции есть.
http://home.mnet-online.de/horst.muc/main.htm
Автор: Mark_Titov
Дата сообщения: 09.05.2010 20:57
...подскажите как сделать в данной паузе задержку не 5 а 2 секунды?


Код: set /a paused=%time:~7,-3%+5
if %paused% GEQ 10 set /a paused=!paused!-10
:check
set /a ttt=%time:~7,-3%
if not %paused%==%ttt% goto :check
Автор: us0r
Дата сообщения: 09.05.2010 21:09
Mark_Titov
Мне кажется ты пишешь троян на .bat- ах )))\

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

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


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