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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

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

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

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



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

Код:
sfc /scannow | FIND /I "Программа защиты ресурсов Windows обнаружила поврежденные файлы" && sfc /scannow  

Всего записей: 565 | Зарегистр. 12-09-2017 | Отправлено: 16:24 08-09-2022
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Какой смысл, это надо постановщика задачи спросить. С моей точки зрения, если в результате работы стало все хорошо, логично возвращать 0.

----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 17:18 08-09-2022
bomzz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
посоветуйте алгоритм как решить. надо найти строку с наибольшим Resolution в файле\потоке,
прблема в том, что все строки разные. и потом надо взять не эту строку а ссылку из следующей
Подробнее...

Всего записей: 3338 | Зарегистр. 29-03-2016 | Отправлено: 15:59 12-09-2022 | Исправлено: bomzz, 22:56 15-09-2022
Grishanenko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запускаю обычный консольный 7z.exe, файл 123.zip не существует.
7z.exe x 123.zip
Первые две строки идут в stdout:
  7-Zip 18.05 (x86) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30
  Scanning the drive for archives:
Следующие строки - в stderr:
  ERROR: Не удается найти указанный файл.
  123.zip
   
  System ERROR:
  Не удается найти указанный файл.
 
При помощи bat файла с таким содержимым:

Код:
@echo off
set 7z_error=0
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=*" %%b in ('7z x 123.zip 2^>^&1' ) do (
if /i "!7z_error!"=="0" set 7z_result=%%b
if /i "!7z_result:~0,5!"=="ERROR" set 7z_error=1
echo %%b
)

Успешно выводится вся информация от 7z.exe и выставляется 7z_error=1 из-за ошибки. В 7z_result залипает сообщение об ошибке.
Но если заменить "7z x 123.zip" на "7z a 123.zip *.jpg" то оказывается что вся выдача в stdout происходит разом и только после завершения процесса архивации.
Что нужно сделать, чтобы команда "echo %%b" (или другая подобная) срабатывала мгновенно?

Всего записей: 694 | Зарегистр. 17-06-2006 | Отправлено: 21:34 27-09-2022
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grishanenko
Ну а что тут можно сделать? Ничего. А для чего вообще все это?

----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 21:49 27-09-2022
Grishanenko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Ну я ведь не знаю какие есть ухищрения при работе с for
Замена %7z_error% на !7z_error! ведь заставила нормально работать if, у которого проблема тоже только внутри for. Вдруг и для echo что-то есть.
Я вот думал что если поменять местами потоки stdout и stderr, то все информационные сообщения попадут сразу на экран, а вот ошибки будут обрабатываться. На них процесс все равно завершится. Но методом тыка (1>&3 2>&1 3>&2) поменять их не получилось.
А нужно это для youtube-dl (yt-dlp). На 7z проще тренироваться, т.к. Python жутко тормозной.
Нужно выловить ошибку, чтобы батник не закрылся, если она появится. Но и нужно видеть процесс загрузки и перекодировки, не залип ли он.

Всего записей: 694 | Зарегистр. 17-06-2006 | Отправлено: 23:39 27-09-2022
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grishanenko
Поток сознания тут не поможет. Внятно объясните, что вы хотите получить. Без загадочного слова "залип" и прочего.

----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 23:50 27-09-2022
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grishanenko
"выловить ашыпку" 7z проще так:

Код:
7z x 123.zip||call :PROCESS_7Z_ERROR "%ERRORLEVEL%" "123.zip"
REM тут код, если ашыпка не выявлена (либо устранена обработчиком ашыпки)
...........
 
goto :EOF
 
:PROCESS_7Z_ERROR
REM Тут код обработки ашыпки
echo 7-zip raised errorlevel %~1 while processing file "%~2"
......
goto :EOF

 
Если вас интересует только содержимое потока stderr {для целей парсинга "врукопашную"}- достаточно перенаправить в nul поток stdout:
Код:
1>nul 7z x 123.zip

 
Добавлено:

Цитата:
поменять местами потоки stdout и stderr,

Фантастика. Оба потока {по умолчанию} идут на одно устройство con в том порядке, в каком их задействует программа. Разделить их можно только через перенаправление одного из потоков в nul (т.е. "в никуда") либо в файл. Из файла можно {по окончании программы} прочитать и обработать как надо {например просто вывести на экран}.

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

Всего записей: 1600 | Зарегистр. 12-10-2006 | Отправлено: 23:59 27-09-2022 | Исправлено: BorlandIMHO, 00:31 28-09-2022
GCRaistlin



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

Цитата:
поменять местами потоки stdout и stderr

Кстати, это можно:

Код:
 
7>&1 8>&2 >&8 2>&7
 


----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 00:46 28-09-2022
BorlandIMHO

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

Цитата:
Кстати, это можно:

Что от этого изменится в выводе на экран?

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

Всего записей: 1600 | Зарегистр. 12-10-2006 | Отправлено: 01:00 28-09-2022
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Да при чем тут экран. Просто интересно было, можно ли.

----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 01:05 28-09-2022
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Такое действие имеет хоть какой-то смысл, если потоки выводятся на разные устройства {например, в *NIX, на tty1 и tty2; сама программа при этом может быть запущена в tty7}. В винде - вполне бессмысленный концепт, ибо консоль одна, причём привязанная к текущему экземпляру conhost, куда всё и валится. Строго в порядке выдачи программы.

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

Всего записей: 1600 | Зарегистр. 12-10-2006 | Отправлено: 01:29 28-09-2022
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
В сете FOR может быть нужда парсить stderr. И сохранять при этом stdout.

----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 01:37 28-09-2022
BorlandIMHO

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

Цитата:
В сете FOR может быть нужда парсить stderr. И сохранять при этом stdout.

Что решаемо только через перенаправление stdout в файл, с последующим чтением {если надо} из этого файла.
В рамках con потоки stdout и stderr неразделимы...

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

Всего записей: 1600 | Зарегистр. 12-10-2006 | Отправлено: 01:45 28-09-2022
GCRaistlin



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

Код:
 
cmd /c "for /f %A in ('7^>^&1 8^>^&2 ^>^&8 2^>^&7 handle foobar') do @echo Stderr: %A" 2>stdout.txt
 


----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 01:57 28-09-2022
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
В плане 7-Zip лучше конечно использовать ключ -bs, а не вот эти все колдунства...

Всего записей: 10853 | Зарегистр. 11-03-2002 | Отправлено: 05:11 28-09-2022
Grishanenko

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

Цитата:
Кстати, это можно:
Код:
7>&1 8>&2 >&8 2>&7  

 
Спасибо! Это именно то, что и нужно было. Теперь все работает как следует.
 
GCRaistlin
Я, вроде, объяснил. Но попробую еще раз. Для галочки.
В цикле for вся информация из stderr мгновенно выдается на экран командой echo %%b.
В цикле for вся информация из stdout "накапливается" и echo %%b я увижу только тогда, когда программа завершит свою работу (а это может быть и 10-20 минут).
После замены, я мгновенно вижу процесс загрузки, что скорость не упала до очень низкой. Если же произойдет ошибка, то далее будет переход по метке и выдача цветной стоки с текстом ошибки через

Код:
echox -c 0C "%7z_result%"

 
%ERRORLEVEL% лишь сообщит о факте ошибки, но не напишет ее текст.

Всего записей: 694 | Зарегистр. 17-06-2006 | Отправлено: 09:03 28-09-2022 | Исправлено: Grishanenko, 09:05 28-09-2022
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grishanenko
Я просил объяснить не алгоритм, а задачу. Это:

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

для меня по-прежнему непонятно.
Впрочем, если вам помогло, то и ладно.

----------
Magically yours
Raistlin

Всего записей: 3480 | Зарегистр. 18-04-2005 | Отправлено: 10:01 28-09-2022
kot1313



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые Профи, может кто знает,  
как с помощью скрипта в конкретной папке Проводника Windows включить Табличный просмотр в основном окне ?  
 
С помощью ПКМ это делается конечно просто - Вид-Таблица, можно исчо и скролом с Ctrl,  
но очень хотелось бы иметь возможность сделать это действие с помощью командной строки ...
 
Буде благодарен за подсказки

Всего записей: 2509 | Зарегистр. 11-12-2002 | Отправлено: 22:40 06-10-2022 | Исправлено: kot1313, 22:41 06-10-2022
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kot1313
Готового рецепта не дам, где копать - подскажу.
Данные об имени папки {с порядком сортировки, отличным от умолчального} винда хранит в реестре, в разделе
Код:
HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\BagMRU

в ключах с цифровыми именами {"0", "1" и т.д.} типа REG_BINARY.
 
Собственно настройки для соответствующей папки хранятся в разделе  
Код:
HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags

в подразделах с соответствующими "именами папки"
 
Дальше - только powershell {в "голом" cmd проблема нерешаема}.
Про чтение ключа реестра тут: https://adamtheautomator.com/powershell-to-get-a-registry-value/
Рецепт по переводу REG_BINARY в человекочитаемый текст есть тут: https://social.technet.microsoft.com/Forums/scriptcenter/en-US/5c4755ee-6fac-40f4-9210-95d50cdbb501/registry-regbinary-to-string
Рецепт по обратному переводу тут: https://stackoverflow.com/questions/18092544/how-to-encode-a-string-to-reg-binary-with-powershell
 
"Краткий алгоритм": читаем все BagMRU, если искомой папки там нет - создаём для неё новый BagMRU и соответствующий Bag.
 
За реализацию я лично - не возьмусь. Спецов правильнее попросить о помощи тут:  http://forum.ru-board.com/topic.cgi?forum=62&topic=30859
 
Добавлено:
P.S. Проще руками выставить...

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

Всего записей: 1600 | Зарегистр. 12-10-2006 | Отправлено: 00:56 07-10-2022
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

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


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2023

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru