Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии - bat, cmd

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

Открыть новую тему     Написать ответ в эту тему

Maz



Дед Мазай
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
часть 1 | часть 2 | часть 3 | часть 4 | часть 5
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору > Автоматизация администрирования
Microsoft Windows > Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
> Описание Cmd.exe > Command shell overview
> Using batch files > Using batch parameters > Using filters > Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Выполнение BAT-скриптов без вызова окна консоли
· cmdow - изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· blat - отправка почты из консоли
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)
 
· Архив всевозможных версий cmd.exe (от Windows NT 3.51 до Windows 10) и command.com (DOS 5.0 и выше). Старые командные процессоры можно запускать на более новых ОС, хотя не всё может работать корректно. Подробная документация по командам cmd.exe и стандартным утилитам ОС для NT 3.51, NT 4.0, NT 5.0 (Windows 2000) и NT 5.2 (Windows Server 2003). Сборник представляет исторический интерес, а также незаменим для тех, у кого появилось желание сделать свои скрипты работоспобными не только на текущей версии ОС. Ссылки wdho.ru tinyupload.com dbree.org
 
· Сборник одним архивом: Сотни Win32 утилит командной строки, нетривиальные .cmd файлы, .bat miniperl скрипты (не требующие полноценной установки Perl), FAR Manager с плагинами и настройками, разное для DOS/DOSBox (откуда под Win32 интерес представляют три продвинутых "мультисистемных" .bat файла да ещё, может быть, оболочка Necromancer DOS Navigator с поддержкой LFN и доступом к буферу обмена Windows). Краткие описания всего - в файликах files.bbs

Всего записей: 37441 | Зарегистр. 26-02-2002 | Отправлено: 13:35 19-09-2020 | Исправлено: Maz, 07:16 24-04-2021
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
да работает с dir /B /S
 
но lexapass подсказал инетереснее вариант
 
 
вот рабочий вариант на базе скрипта BorlandIMHO

Код:
 
@echo off
copy /y nul "%TEMP%\cert_serials.tmp" ||exit
for /F "usebackq tokens=3" %%N in (`%~dp0certutil.exe -v -store addressbook^|findstr /c:"Serial Number:"`) do 1>>"%TEMP%\cert_serials.tmp" echo %%N
for %%C in ("\\srv\certs\*.cer") do (
    for /F "usebackq tokens=3" %%F in (`%~dp0certutil.exe -v "%%C"^|findstr /c:"Serial Number:"`) do find /I "%%F" "%TEMP%\cert_serials.tmp" || certutil -f -addstore "addressbook" "%%C"
)
del /q "%TEMP%\cert_serials.tmp"
goto :EOF  
 

 
но я кладу рядом с CMD 3 файла от EN версии
certutil.exe
certadm.dll
certcli.dll
 
как внутри for изменить chcp 437 до меня не дошло, помогите..
 
работает и 7ке и в 10ке
 
интерес вызывает то, что такого хранилища как "Другие пользователи" изначально нет и выходит ошибка при считывании данных от туда, но пустой файл все равно создается и далее происходит поиск в нем, и поскольку в нем пусто certutil -f принудительно создает это хранилище и кладет туда сертификат.
 
изменил поиск на фразу findstr /c:"Serial Number:"
изменил tokens на 3
 
~ ~f поубирал из переменных, поправьте если не прав..
 ||exit  не могу понять как работает это, выйти если не смог создать файл?  
 
 
 
 
 
 
 

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 10:51 22-09-2021 | Исправлено: JohnRD, 10:58 22-09-2021
AVAV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
BorlandIMHO
 

Цитата:
for /F "usebackq delims=" %%D in (`wmic os get Description /value^|findstr "="') do set "%%D"
if "%Description*%"=="*" (echo Description пустой) else (echo Description не пустой)
 
Вместо эха вставляйте любую потребную обработку...

 
Экспериментирую 2й день, чтобы заработало. Надо проверку для ПК- пустое описание или заполненное.
Пока не получается, не всегда понятно как проверить на каком этапе что-то не так идет.
По моему usebackq надо убрать, тогда через cmd видно что-то вида set = Description=Заполнено
А вот проверка if "%Description*%"=="*" похоже не работает, одинаковый всегда результат.

Всего записей: 19 | Зарегистр. 16-05-2003 | Отправлено: 17:04 22-09-2021
anynamer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Немного другая задача, чем работа с файлами (если тут возможно) - работа в простом текстовом файле .txt  
Как убрать первые четыре цифры и поставить их в конец строки после пробела и поместить их в квадратные скобки
Итого убрать-удалить первые 7 символов (4 цифры, пробел, тире "-", и ещё один пробел), если в начале первые четыре символа цифры и переместить эти первые 4 цифры в конец строки после пробела в квадратные скобки
 
1993 - День Победы
1995 - Le pouvoir aux Soviets
 
День Победы [1993]
Le pouvoir aux Soviets [1995]

Всего записей: 1944 | Зарегистр. 17-05-2010 | Отправлено: 17:18 22-09-2021 | Исправлено: anynamer, 17:19 22-09-2021
lexapass



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JohnRD

Цитата:
как внутри for изменить chcp 437 до меня не дошло, помогите..  

Или

Код:
...
chcp 437
for ...

или

Код:
for ... ('chcp 437 ^>nul ^&%~dp0certutil.exe ...') do ...

 
На мой взгляд лучше первый вариант.
 
AVAV
В set потеряно присвоение переменной Description и символ * не на том месте. И usebackq действительно лишний.  
Правильнее было бы так:

Код:
for /F "tokens=2 delims==" %%D in ('wmic os get Description /value^|findstr "="') do set "Description=%%D"
if "%Description%*"=="*" (echo Description пустой) else (echo Description не пустой)
 
Вместо эха вставляйте любую потребную обработку...  

Всего записей: 550 | Зарегистр. 11-10-2004 | Отправлено: 18:22 22-09-2021 | Исправлено: lexapass, 22:05 22-09-2021
AVAV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Fenrizz
lexapass
Спасибо всем за содействие!  
Сорри, увы не совсем понял про
Цитата:
и символ * не на том месте

 
но вроде только в следующей конструкции все заработало как надо:
 
for /F "delims=" %%D in ('wmic os get Description /value^|findstr "="') do set "Description=%%D"
if "%Description%"=="Description=" (echo Description null) else (echo Description not null)

Всего записей: 19 | Зарегистр. 16-05-2003 | Отправлено: 20:01 22-09-2021
lexapass



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AVAV
Символ '*' Вы внесли внутрь имени переменной до закрывающего символа '%', что является ошибкой.  
Далее в Вашем варианте выше по факту переменной Description присваивается не значение запрашиваемого параметра Description, а название параметра, так как при указании разделителя '=' используется первое по умолчанию значение (она же подстрока из справки for /?) , т.е. само название, когда нужно брать то, что после знака '=', т.е. второе значение (подстроку), на что указывает 'tokens=2' в моем примере.
Если wmic выдаст пустое значение параметра Description после знака '=', то последующая команда set удалит переменную Description, т.е. результатом %Description% будет пустая строка. Проверка с добавлением символа * нужна как раз для этого.

Всего записей: 550 | Зарегистр. 11-10-2004 | Отправлено: 20:33 22-09-2021 | Исправлено: lexapass, 20:36 22-09-2021
AVAV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lexapass
Спасибо за разъяснение. Вы правы, в моем варианте получается берется все строка "Description=<значение>". Я пробовал и с tokens=2, результат либо такой же - т.е. вся строка, соответственно следующая конструкция IF... не работает, либо обнаружил, что бывает переменной Description не присваивается значение... Наверно также нужно что-то скорректировать в первой строке, не силен в этом. Хотя интересно посмотреть рабочий вариант, чтобы Description присваивалось именно значение без "Description="

Всего записей: 19 | Зарегистр. 16-05-2003 | Отправлено: 21:10 22-09-2021 | Исправлено: AVAV, 21:24 22-09-2021
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JohnRD

Цитата:
как внутри for изменить chcp 437 до меня не дошло, помогите..

Совсем необязательно это делать внутри for, можно перед. Можно вообще в самом начале скрипта, если нет необходимости вывода скриптом неанглийского текста.

Цитата:
~f поубирал из переменных, поправьте если не прав

модификатор "~f", согласно справке  for, означает "полное имя файла", т.е. с буквой диска и путём. Насколько оно вам нужно - решайте сами...

Цитата:
||exit  не могу понять как работает это, выйти если не смог создать файл?

Конструкция "||exit" означает "завершение выполнения скрипта, если предыдущая команда завершилась с ненулевым errorlevel" (для большинства команд, ненулевой errorlevel возникает при любых ошибках выполнения).
 
AVAV

Цитата:
вот проверка if "%Description*%"==

В изначальном тексте команды была ошибка - * перед %, а не после как должно быть { if "%Description%*"==}. Моя ошибка, я её потом исправил, но вы продолжаете пользоваться ошибочным вариантом...
 
anynamer

Цитата:
удалить первые 7 символов (4 цифры, пробел, тире "-", и ещё один пробел), если в начале первые четыре символа цифры и переместить эти первые 4 цифры в конец строки после пробела

Сдаётся мне, что ваша задача не решаема "голым" cmd, потребуются более мощные средства (как минимум - powershell/jscript/vbs, а то и более специализированные средства типа grep).

----------
http://www.imho.ws

Всего записей: 1244 | Зарегистр. 12-10-2006 | Отправлено: 22:05 22-09-2021
lexapass



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AVAV
Так и есть, в моем примере выше была ошибка, должно быть "... delims==".
Тогда будет работать как надо.
 

Всего записей: 550 | Зарегистр. 11-10-2004 | Отправлено: 22:10 22-09-2021
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lexapass

Цитата:
В set потеряно присвоение переменной Description

Ну, не сказал бы.

Код:
for /F "usebackq delims=" %%D in (`wmic os get Description /value^|findstr "="`) do set "%%D"

{там ещё и закрывающего backquote не хватало в конце команды в скобках, только сейчас понял }
Собственно, команда в скобках выдаёт единственную строчку "Description=Описание ......." либо "Description=" если описание пустое. При таких раскладах замечательно работает конструкция {set "%%D"}, присваивающая соответствующее значение переменной Description. И не надо строку "токенить". Вообще говоря, такая форма команды позволяет вытаскивать одним for с wmic несколько переменных, что в данном случае не очень актуально, но вообще полезно. Например, {for /f "usebackq delims=" %%A in (`wmic path Win32_UTCTime get year^,month^,day^,hour^,minute^,second /value ^| find "="`) do set /A "%%~A"} для получения даты/времени с разбивкой по компонентам.

Цитата:
usebackq действительно лишний

Это да. Я его по привычке использую, как и саму обратную кавычку...

----------
http://www.imho.ws

Всего записей: 1244 | Зарегистр. 12-10-2006 | Отправлено: 22:31 22-09-2021 | Исправлено: BorlandIMHO, 22:55 22-09-2021
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anynamer

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

 
Без проверок, что строка именно в таком формате, примерно так

Код:
for /f "tokens=1,* delims=- " %%A in (filename.txt) do echo %%B [%%A]

 
С проверкой немного посложнее

Код:
@echo off
 
for /f "tokens=*" %%A in (filename.txt) do (
echo %%A |>nul FINDSTR /R /C:"[1-9][1-9][1-9][1-9] - .*"
if errorlevel 1 echo %%A
if NOT errorlevel 1 (for /f "tokens=1,* delims=- " %%C in ('echo %%A') do echo %%D [%%C] )
)  
 

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 07:49 23-09-2021 | Исправлено: Fenrizz, 08:27 23-09-2021
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
lexapass
 
 
я ж не настоящий сварщик, ввожу команды прямо в смд
chcp 437
certutil -v -store addressbook
Вывод верный

Код:
 
Serial Number: 01d76da04fd9aea00000033603e80002
Signature Algorithm:
    Algorithm ObjectId: 1.2.643.7.1.1.3.2 ???? ? 34.11-2012/34.10-2012 256 ???
    Algorithm Parameters:
    05 00
Issuer:
    CN=???? ??????????? ??????????? ?????????? ?????????
    OU=??????????? ???????
    O=???? ??????????? ??????????? ?????????? ?????????
 

далее
for /f "usebackq tokens=1-3" %g in (`certutil -v -store addressbook^|findstr "Serial"`) do echo %g %h %i
вывода нет
..
 
а вот вывод, на туже команду если подкладываю EN certutil прямо в текущую папку

Код:
 
Z:\Scripts\3>echo Serial Number: 01d76da04fd9aea00000033603e80002
Serial Number: 01d76da04fd9aea00000033603e80002
 
Z:\Scripts\3>echo Serial Number: 01d76da602fdb8a00000033603e80002
Serial Number: 01d76da602fdb8a00000033603e80002
 

 
далее убираю EN certutil из текущей папки
chcp 866
certutil -v -store addressbook

Код:
 
Серийный номер: 01d76da602fdb8a00000033603e80002
Алгоритм подписи:
    ObjectID алгоритма: 1.2.643.7.1.1.3.2 ГОСТ Р 34.11-2012/34.10-2012 256 бит
    Параметры алгоритма:
    05 00
Поставщик:
    CN=Фонд социального страхования Российской Федерации
    OU=Центральный аппарат
    O=Фонд социального страхования Российской Федерации
 

 
for /f "usebackq tokens=1-3" %g in (`certutil -v -store addressbook ^|findstr "Серийный"`) do echo %g %h %i
 
вывода нет

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 09:35 23-09-2021 | Исправлено: JohnRD, 10:01 23-09-2021
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JohnRD
Возможно, проблема в этом

Цитата:
FINDSTR does not support UTF-16 files, but FIND does.

Попробуйте так  

Код:
(`certutil -v -store addressbook ^|find "Серийный"`)

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 10:02 23-09-2021
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
 
Z:\Scripts\3>chcp 866
Текущая кодовая страница: 866
 
Z:\Scripts\3>for /f "usebackq tokens=1-3" %g in (`certutil -v -store addressbook
^|find "Серийный"`) do echo %g %h %i
 
чисто
 
 
Z:\Scripts\3>ver
 
Microsoft Windows [Version 6.1.7601]

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 10:16 23-09-2021 | Исправлено: JohnRD, 10:17 23-09-2021
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
JohnRD
Запустил 6 виртуалок с разными виндами чисто для натурных экспериментов...
Итоги:
1. В русефецырованной венде (от 7 до 2019) certutil всегда выдаёт русский текст. Найти в нём слово "серийный" может только find (не findstr) и только в CP1251 (chcp 1251 перед выполнением certutil).
2. В английской венде certutil всегда пишет по-английски, слово serial ищется что find, что findstr при любой допустимой CP.
3. Сама по себе certutil.exe в русской и английской венде {10-ке одной версии} абсолютно идентична. О какой "certutil EN версии" при этом идёт речь - мне не очень понятно.

----------
http://www.imho.ws

Всего записей: 1244 | Зарегистр. 12-10-2006 | Отправлено: 13:01 23-09-2021
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
 
и правда версия старая 5.2.3790.1830  это 2003 сервака файлы
 
лежат давно у меня файлы, что то видимо не работало на файлах от 2008R2 на пк старее, зато наоборот все было хорошо, так и взял их же, и на 10ке пашут как ни странно
вечно зоопарк пк  xp 7 8 10
 
 
у русской 7ки и 2008R2EN действительно одинаковые файлы, дата и даже хеш один и тот же
 
у 10ки видимо тоже самое
 
в 2003 серваке нет такой утилиты, видимо она взята из админкита
 
 
 

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 13:34 23-09-2021 | Исправлено: JohnRD, 14:36 23-09-2021
anynamer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
Скрипт не изменяет txt файл
Скрипт не обрабатывает годы где есть ноль - 0
Скрипт неправильно обрабатывает некоторые строки
 
1999 - Парад. Марши в исполнении духовых оркестров
2000 - 20 золотых шедевров романса
2000 - Des fusils & des tracteurs
2000 - Russian Folk Songs
 
То что в окне cmd, в файле изменений никаких:

Код:
Парад. Марши в исполнении духовых оркестров [1999]
2000 - 20 золотых шедевров романса
'des' is not recognized as an internal or external command,
operable program or batch file.
2000 - Des fusils & des tracteurs
2000 - Russian Folk Songs

 
Добавлено:
а понял - des ему не понравился из-за "&"
 
Добавлено:
ещё я добавил в скрипт из-за utf-8
chcp 65001 >nul
 
Добавлено:
Вариант без проверки на первые цифры мне совсем не подходит - есть названия без года в начале и с пробелом и тире в названии.

Всего записей: 1944 | Зарегистр. 17-05-2010 | Отправлено: 15:01 23-09-2021 | Исправлено: anynamer, 15:15 23-09-2021
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anynamer

Цитата:
Скрипт не изменяет txt файл  

Так он и не должен, он выводит результаты в консоль.
Если нужно в файл, то  

Код:
@echo off
 
for /f "tokens=*" %%A in (filename.txt) do (
echo %%A |>nul FINDSTR /R /C:"[1-9][1-9][1-9][1-9] - .*"
if errorlevel 1 echo %%A >>filename2.txt
if NOT errorlevel 1 (for /f "tokens=1,* delims=- " %%C in ('echo %%A') do echo %%D [%%C] >>filename2.txt )
)  
 

Или просто file.bat > out.txt
 

Цитата:
Скрипт не обрабатывает годы где есть ноль - 0  

Да, что-то я забыл про 0, должно быть

Код:
echo %%A |>nul FINDSTR /R /C:"[0-9][0-9][0-9][0-9] - .*"

 
 

Цитата:
а понял - des ему не понравился из-за "&"

Вот исправленный вариант

Код:
@echo off
 
del /Q filename2.txt
for /f "tokens=*" %%A in (filename.txt) do (
echo "%%A" |>nul FINDSTR /R /C:""""[0-9][0-9][0-9][0-9] - .*""""
if NOT errorlevel 1 (for /f "tokens=1,* delims=- " %%C in ("%%A") do echo %%D [%%C] >>filename2.txt)
if errorlevel 1 echo %%A >>filename2.txt
)
 

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 15:51 23-09-2021 | Исправлено: Fenrizz, 16:11 23-09-2021
anynamer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
Спасибо!
Скрипт в конце строки ставит пробел, нужно без него.

Всего записей: 1944 | Зарегистр. 17-05-2010 | Отправлено: 16:35 23-09-2021
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anynamer
Надо убрать пробел между echo и >>

Код:
@echo off
 
del /Q filename2.txt
for /f "tokens=*" %%A in (filename.txt) do (
echo "%%A" |>nul FINDSTR /R /C:""""[0-9][0-9][0-9][0-9] - .*""""
if NOT errorlevel 1 (for /f "tokens=1,* delims=- " %%C in ("%%A") do echo %%D [%%C]>>filename2.txt)
if errorlevel 1 echo %%A>>filename2.txt
)
 

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 16:39 23-09-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии - bat, cmd


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru