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

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

Автор: Maza Faka
Дата сообщения: 27.03.2008 07:11
ffirefox

Цитата:
Такая странная проблема:

Сохрани батник в DOS кодировке и не парься с переключением кодировок.
Автор: 01MDM
Дата сообщения: 27.03.2008 09:48
JekaRus

Цитата:
И еще хотелось чтобы в системной папке удалялись файлы от установленных заплаток типа $NtUninstallKB835732$, где после КВ может быть любой номер. Как это циклом организовать?



Код:
@echo off
pushd %windir%
for /f %%i in ('dir /b /ad $Nt* ^| findstr KB[0-9]') do (
    echo %%i
    rem rd /s /q %%i
)
popd
Автор: misha1950
Дата сообщения: 27.03.2008 11:43
Сдраствуйте. Мне нужен bat. файл который при маленькой скорости (Настройка скорости) закачки визовал reconnect.bat Спасибо!!!
Автор: gryu
Дата сообщения: 27.03.2008 15:07
Коллеги, в шапке, если покопатся, можно найти следующий сценарий для Чтение из файлов содержащих ключи и значения (подобно структуре .ini файлов)

Set FileToRead=data.cfg
Set Key=full
For /F "usebackq delims=" %%i In (`Find /I "%Key%=" %FileToRead%`) Do Set Value=%%i
Echo %Value:~+5%

Вроде как рабочий, но у меня почему то не получается.
Он не находит нужный ключ. ...
Привожу свой пример сделанный на основе этого.

Set FileToRead=out.reg
Set Key="Pad"
For /F "usebackq delims=" %%i In (`Find /I "%Key%=" %FileToRead%`) Do Set Value=%%i
Echo %value%>pad.reg
pause

вот лог


C:\Temp\experiments\editing\test>Set FileToRead=out.reg

C:\Temp\experiments\editing\test>Set Key="Pad"

C:\Temp\experiments\editing\test>For /F "usebackq delims=" %i In (`Find /I ""Pad
"=" out.reg`) Do Set Value=%i
Не найден файл: PAD

C:\Temp\experiments\editing\test>Set Value=---------- OUT.REG

C:\Temp\experiments\editing\test>Set Value="Pad"="76455ffff7890gg"

C:\Temp\experiments\editing\test>Set Value="DigitalID"=hex:a4,00,00,00,03,00,00,
00,37,36,34,35,35,2d,4f,45,4d,2d,\

C:\Temp\experiments\editing\test>Echo "DigitalID"=hex:a4,00,00,00,03,00,00,00,37
,36,34,35,35,2d,4f,45,4d,2d,\ 1>pad.reg

Что не правильно?
Автор: Elroir
Дата сообщения: 27.03.2008 15:18
gryu
Попробуй поменять Set Key="Pad" на Set "Key=Pad"
Автор: gryu
Дата сообщения: 27.03.2008 17:17
Elroir
Вообще не работает.
При Set Key="Pad" он выдаёт в конечый файл последние (самой нижние) ключ и значение
При Set "Key=Pad" он он выдаёт в конечный файл только имя файла источника ---------- out.reg
При Set "Key="Pad"" тоже самое что и Set Key="Pad"
Автор: Elroir
Дата сообщения: 27.03.2008 18:13
gryu
Пробуй так:

Код:
Set Key="Pad"
For /F "usebackq skip=1 delims=" %%i In (`Find /I ""%Key%"=" %FileToRead%`) Do Set Value=%%i
Автор: gryu
Дата сообщения: 27.03.2008 18:26
Elroir
спасибо. получилось.
если не возражаешь её один вопрос.
есть переменная %%I
Данная переменная состоит из единой группы букв и цифр
Нужно эту единую группу разбить по подгруппам разделённым запятой.
т.е есть
***********************
а сделать нужно
********,********,********
Автор: Elroir
Дата сообщения: 27.03.2008 18:30
gryu
Нужно отделять определенное количество символов? Всегда одно и то же?
Автор: gryu
Дата сообщения: 27.03.2008 18:56
Elroir
да. символы могут быть разные.
т.е. через каждые 8 символов нужно ставить запятую
Автор: Elroir
Дата сообщения: 27.03.2008 19:47
gryu
Пример:

Код:
for %%I in (12345678qwertyui12345678 asdfghjk12345678zxcvbnml) do (
set "parts="
call :divide "%%I"
)
goto :EOF
:divide
set "parts=%~1"
set "parts=%parts:~0,8%,%parts:~8,8%,%parts:~16%"
echo %parts%
Автор: gryu
Дата сообщения: 28.03.2008 12:12
Elroir
способ работает, но к сожалению не годится.
Там в нескольких местах длинна ключа 256 и 512 знаков.
Банально в строку не влазит. (не говоря уже том, что оболдеешь писать)
Перевод строки "^" не работает почему то.
Да и ... не эстетично
Как то надо через ещё одну переменную наверно.
А как что то не соображу.
Думал через set /a но что то не соображу как.
Автор: 01MDM
Дата сообщения: 28.03.2008 12:29
gryu

Попробуй, должен работать до 800 знаков (если длина переменной позволит) и если в строке нет спецсимволов (! < = > " %)

Код:
@echo off
setlocal

for %%i in (12345678123456781234567812345678123456781234567812345678) do call:job "%%i"
set xxx=%xxx:~0,-1%
echo %xxx%
goto:eof

:job
set xxx=%~1
set /p=%xxx%<nul>len.tmp
for /f %%i in ('dir /b len.tmp') do set len=%%~zi
del len.tmp

set /a part=len/8

for /l %%i in (0,1,%part%) do call:divd %%i
set xxx=
for /f "tokens=2 delims==" %%i in ('set ss') do call:conc "%%i"
goto:eof

:divd
set ind=0%1
if not "%xxx%"=="" set ss%ind:~-2,2%=%xxx:~0,8%
set xxx=%xxx:~8%
goto:eof

:conc
set xxx=%xxx%%~1,
Автор: gryu
Дата сообщения: 28.03.2008 13:22
01MDM
о как!
Кхм. Совсем туплю я чтоли?
Итак. Берём твой пример и вместо переменной в тупую подставляем значение
(в идиале там переменная указываеся.)
В конце делаем вывод полученного в файл. (для проверки результата, чтоб в идеале результат передать для долнейшей обработки)
А получаем ....:-(

[more=Пример ->]
setlocal

for %%i in (A40000000300000037363438372D3634302D323539363435342D3233323638002E0000004132322D3030303031000000000000007A2C534CFCDEF58696B25186CB4A0200000000004DF886471F910100000000000000000000000000000000000000000000000000333437303400000000000000FC15000030BC833CFF01000000250000000000000000000000000000000000000000000000000000000000009BC85D0D) do call:job "%%i"
set xxx=%xxx:~0,-1%
echo %xxx%
goto:eof

:job
set xxx=%~1
set /p=%xxx%<nul>len.tmp
for /f %%i in ('dir /b len.tmp') do set len=%%~zi
del len.tmp

set /a part=len/8

for /l %%i in (0,1,%part%) do call:divd %%i
set xxx=
for /f "tokens=2 delims==" %%i in ('set ss') do call:conc "%%i"
goto:eof

:divd
set ind=0%1
if not "%xxx%"=="" set ss%ind:~-2,2%=%xxx:~0,8%
set xxx=%xxx:~8%
goto:eof

:conc
set xxx=%xxx%%~1,

echo %xxx%>>t.txt
[/more]

[more=Результат ->]
9BC85D0D ,
9BC85D0D , ,
9BC85D0D , , 00250000 ,
9BC85D0D , , 00250000 , 00000000 ,
9BC85D0D , , 00250000 , 00000000 , 00000000 ,
9BC85D0D , , 00250000 , 00000000 , 00000000 , 00000000 ,
9BC85D0D , , 00250000 , 00000000 , 00000000 , 00000000 , 00000000 ,
9BC85D0D , , 00250000 , 00000000 , 00000000 , 00000000 , 00000000 , 00000000 ,
9BC85D0D , , 00250000 , 00000000 , 00000000 , 00000000 , 00000000 , 00000000 , 00000000 ,
9BC85D0D , , 00250000 , 00000000 , 00000000 , 00000000 , 00000000 , 00000000 , 00000000 , 00000000 ,
[/more]


[more=А должно быть ->]
A4000000,03000000,37363438,372D3634,302D3235,39363435,342D3233,32363800,2E000000,4132322D,30303030,3...,***,...00,9BC85D0D[/more]
:?
Автор: 01MDM
Дата сообщения: 28.03.2008 13:41
gryu

Проверил твой пример - все OK. . Концевые пробелы в батнике могут быть причиной.

Только ты последнюю строчку убери, если надо перенаправить в файл то сделай это здесь:

Код:
@echo off
setlocal

for %%i in (bla-bla-bla) do call:job "%%i"
set xxx=%xxx:~0,-1%
echo %xxx% >1.txt
goto:eof
....
....
Автор: igor_andreev
Дата сообщения: 28.03.2008 14:02
01MDM

Цитата:
Концевые пробелы в батнике могут быть причиной.

Про "костыль" для копирования я упоминал тут
Автор: gryu
Дата сообщения: 28.03.2008 14:05
01MDMПро концевые пробелы я вспомнил. .... (правда после того как уже написал.. )
По поводу перенаправления.
Мне не в файл нужно, обозвать результат переменной и передать дальше для обработки.
В файл это я для проверки.
Автор: 01MDM
Дата сообщения: 28.03.2008 14:09
igor_andreev
Надо на видное место, рядом с важно




Добавлено:
gryu


Цитата:
Мне не в файл нужно, обозвать результат переменной и передать дальше для обработки.
В файл это я для проверки.


Тогда:

Код:
@echo off
setlocal

for %%i in (bla-bla-bla) do call:job "%%i"
set xxx=%xxx:~0,-1%

:: Перемнная %xxx% в этом месте определена, с запятыми
goto:labelForFurthertJob
....
....
Автор: Elroir
Дата сообщения: 28.03.2008 14:16
gryu
Я же давал именно пример. Вот еще один вариант, ограничение - максимальная длина строки в CMD.
Вместо моей строчки с for-он подставь свою (откуда-то у же тебя строчки в переменную %%I попадают):

Код:
@echo off
setlocal
for %%I in (A40000000300000037363438372D3634302D323539363435342D3233323638002E0000004132322D3030303031000000000000007A2C534CFCDEF58696B25186CB4A0200000000004DF886471F910100000000000000000000000000000000000000000000000000333437303400000000000000FC15000030BC833CFF01000000250000000000000000000000000000000000000000000000000000000000009BC85D0DA40000000300000037363438372D3634302D323539363435342D3233323638002E0000004132322D3030303031000000000000007A2C534CFCDEF58696B25186CB4A0200000000004DF886471F910100000000000000000000000000000000000000000000000000333437303400000000000000FC15000030BC833CFF01000000250000000000000000000000000000000000000000000000000000000000009BC85D0D) do (
set "divided="
set "parts=%%I"
call :divide
)
echo %divided%
goto :EOF
:divide
if "%parts%"=="" (
set "divided=%divided:~0,-1%"
goto :EOF
)
set "divided=%divided%%parts:~0,8%,"
set "parts=%parts:~8%"
goto divide
Автор: XXXXL
Дата сообщения: 29.03.2008 19:04
Ребята, есть текстовой документ с примерно следующим содержимом в одну строку:
rt54%67/%$90)(%&ghjkdhg
одним словом латинские буквы, все возможные символы и цифры. Реально ли через командную строку удалить все символы, оставив только буквы и цифры
Пример:
было rt54%67/%$90)(%&ghjkdhg
стало rt546790ghjkdhg

Зарание благодарен вам за потерянное время.
Автор: igor_andreev
Дата сообщения: 29.03.2008 19:30
XXXXL
sed.exe можно заюзать, или vbscript. Чистый батник не всегда адекватно будет реагировать на спецсимволы

Код:
sed -e "s/[^a-z0-9.]//g" old.txt>new.txt
Автор: Elroir
Дата сообщения: 29.03.2008 19:34
XXXXL
Предположим, что строчка находится в файле test.txt, тогда:

Код:
@echo off
setlocal
for /f "tokens=*" %%a in (test.txt) do (set "line=%%a")
call :alfanum
:: В переменной %newline% сейчас находится строка с оставшимися символами
echo %newline%
goto :EOF
:alfanum
set "include="
set "letter=%line:~0,1%"
for %%a 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 1 2 3 4 5 6 7 8 9 0) do (
if /i "%letter%"=="%%a" (set "include=yes")
)
if defined include set "newline=%newline%%letter%"
set "line=%line:~1%"
if not "%line%"=="" goto alfanum
Автор: igor_andreev
Дата сообщения: 29.03.2008 19:46
XXXXL
Предыдущая строчка с sed была именно для твоего примера - "rt54%67/%$90)(%&ghjkdhg" Если есть и прописные и строчные буквы, то нужно [^A-Za-z0-9.]


Добавлено:
Elroir
Да я и сам в регулярных выражениях не силен, более-менее простые вещи еще могу, со сложными начинаю спотыкаться.
Автор: XXXXL
Дата сообщения: 29.03.2008 20:19
igor_andreev,Elroir, спасибо вам ребята за отзывчивость!

Автор: gryu
Дата сообщения: 30.03.2008 18:18
Elroir, 01MDM спасибо. Только сегодня смог взятся за скрипт.
Спасибо ещё раз. Воспользовался предложенным Elroirом.


Автор: igor_andreev
Дата сообщения: 30.03.2008 19:48
Elroir

Цитата:
Вот еще один вариант, ограничение - максимальная длина строки в CMD.

Кстати с sed в этом плане попроще, у нее ограничения наверное есть, но где то за пределами разумного. Создал сейчас файл test.txt - чуть больше миллиона знаков в одну строчку. За полсекунды разделила каждые восемь знаков запятой

Код:
sed -e "s/\(.\{8\}\)/\1\,/g" test.txt >new.txt
Автор: gryu
Дата сообщения: 30.03.2008 21:09
igor_andreev

Цитата:
sed у меня сейчас эта http://sed.sourceforge.net/grabbag/ssed/sed-3.59.zip (super-sed)

т.е. идея в том, что на машине существуют сторонние программы пр помощи которых и производятся операции?
Тогда это однозначно не пойдёт.
Идея в том, что бы делать всё чисто штатными средствами.
Отослал батник - получил результат.

Добавлено:
Кстати, если я не ошибаюсь, то в бат-файле нет возможности создать меню с выбором исполняемого блока. Или всё же есть?
Интересует результат типа
1. Бэкап
2. Ресторе
3. Выход
С выбором.
(организация требуемого сторонней программой возможна. А вот может прямо так можно??? )
Автор: 01MDM
Дата сообщения: 30.03.2008 21:38
gryu


Цитата:
Кстати, если я не ошибаюсь, то в бат-файле нет возможности создать меню с выбором исполняемого блока. Или всё же есть?
Интересует результат типа
1. Бэкап
2. Ресторе
3. Выход
С выбором.
(организация требуемого сторонней программой возможна. А вот может прямо так можно??? )


В смысле выбор задачи для выполнения интерактивно? Можно.


Код:
@echo off
echo [1] Task1
echo [2] Task2
echo [3] Task3

set /p tsk="Choose a task by number: "

if not defined tsk goto:eof
if %tsk%==1 goto:1
if %tsk%==2 goto:2
if %tsk%==3 goto:3
goto:eof

:1
echo 1
goto:eof
:2
echo 2
goto:eof
:3
echo 3
goto:eof

Автор: gryu
Дата сообщения: 30.03.2008 21:48
01MDM
Опа.
А я перечитал кучу инфы, и нигде не указано.
пробовал как в конфиге через [MENU], но не работает.
Автор: drondo
Дата сообщения: 02.04.2008 17:07
Имется ноут, который ношу на работу. есть две локалки, на работе и дома соответственно. настройки сетевого соединения отличаются лишь IP адресом, DNS и шлюзом. скажите можно ли сделать чтото типа скрипта или батника для автоматизации изменения сетевых параметров? Ручками надоело каждый день. Программы типа NETswitcher не предлагать, нужен именно скрипт, батник или подобное.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: DVD-video (ДВД-видео) - что и как (часть 3)


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