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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzz
Для поставленной задачи (удалить знак вопроса и всё после него) - корректная.
 

Цитата:
будет работать?

Смотря как реализуете и каковы входные данные.

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

Всего записей: 3099 | Зарегистр. 18-04-2005 | Отправлено: 15:21 21-05-2021
bomzz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сделал. огромное спаисбо за советы и наставления

Всего записей: 3069 | Зарегистр. 29-03-2016 | Отправлено: 15:55 21-05-2021 | Исправлено: bomzz, 17:09 21-05-2021
Egor2020

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не знаю, в какой теме это написать, поэтому я напишу сюда. Заранее извините меня, если я не туда написал.
У меня есть Firefox-расширение User-Agent Switcher and Manager версии 0.4.4, которое позволяет подменять юзер-агенты на сайтах. Данное расширение хранит свою базу данных юзер-агентов в файлах формата JSON. Эти файлы имеют следующий вид:
Подробнее...
Мне нужен BAT-файл, который вытаскивает все юзер-агенты из всех JSON-файлов и сохраняет их в TXT-файле. Копипастить по одному юзер-агенту очень долго и утомительно. Заранее спасибо.
P.S. Ссылка на набор JSON-файлов с юзер-агентами: https://disk.yandex.ru/d/QqjVs-6sqCNXag

Всего записей: 866 | Зарегистр. 01-03-2020 | Отправлено: 18:33 31-05-2021
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Egor2020
Это лучше делать на Powershell. Что-нибудь вроде
Код:
powershell -nologo -Command "Get-ChildItem -Path '.\browsers\*'|Get-content |ConvertFrom-Json"

Такие вопросы лучше задавать в топике "Сценарии для Windows (Microsoft Windows)", там спецов больше тусуется.
 
P.S. Выдрать все "ua" из всех джейсонов в папке "browsers" и записать в текстовик "ua.txt":
Код:
chcp 65001 & powershell -NoLogo -Command "(Get-ChildItem -Path '.\Browsers\*' -Include *.json | Get-content | ConvertFrom-Json).ua" >ua2.txt

 
P.P.S. Исправлено соласно замечаний kraeved

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

Всего записей: 1245 | Зарегистр. 12-10-2006 | Отправлено: 20:07 31-05-2021 | Исправлено: BorlandIMHO, 07:13 01-06-2021
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Egor2020
Для таких случаев есть консольный парсер JSON - https://stedolan.github.io/jq/download/
 
В данном случае будет примерно так:

Код:
 
@echo off
FOR %%G in (*.json) do (
type "%%G" | jq-win64.exe --raw-output ".[].ua" >"%%~nG.txt" )
 

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 23:03 31-05-2021 | Исправлено: Fenrizz, 23:06 31-05-2021
BorlandIMHO

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

Цитата:
В данном случае будет примерно так:

Аналогичный результат ("ua из каждого json в папке Browsers в отдельный файл") на powershell:
Код:
powershell -NoLogo -Command "(Get-ChildItem -Path '.\Browsers\*' )|ForEach {($_|Get-content |ConvertFrom-Json).ua|Out-File -FilePath $('.\ua.'+$_.Name.Substring(0,$_.Name.length-5)+'.txt') -Encoding utf8"}
 

 
Fenrizz
Специализированный инструмент - это замечательно; подозреваю, что программа на чистом Си даже будет несколько шустрее, нежели повершельный аналог. Однако же, повершелл по умолчанию есть на любой винде начиная с Vista - в отличие от инструмента, который требуется либо распространять совместно со скриптом, либо скачивать отдельно каждый раз при запуске на новой машине...
 
P.S. Исправлено соласно замечаний kraeved

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

Всего записей: 1245 | Зарегистр. 12-10-2006 | Отправлено: 01:19 01-06-2021 | Исправлено: BorlandIMHO, 07:18 01-06-2021
kraeved



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Egor2020
В папке запустите powershell -command "(gc *.json | convertfrom-json).ua | sc ua.txt"
Если нервирует тьма командной строки, вставьте это в адресную строку Проводника.
 
Fenrizz
Можно без type, ибо jq умеет принимать файл на входе. А вывод просили в [один] файл,
поэтому достаточно for %f in (*.json) do jq -r ".[].ua" "%f" >> ua.txt (удвоить % в батнике).
Альтернативой jq является xidel -s -e "$json().ua", но недостаток обращений через цикл
в низкой скорости — уместнее искать пакетный режим напрямую. Увы, вызов jq *.json
выдаёт ошибку в Windows. Фикс есть, но версия с ним ожидается уже несколько лет.

 
BorlandIMHO
Ваш изначальный код создаёт пустой ua.txt — стоило проверить перед публикацией!
Заработает с путём .\Browsers\*, но это не спасёт Out-File, выдающий огромный UTF-16 LE.
Использовать ASCII в данном случае нельзя, т.к. в одном json находится агент с умляутом.
Ключ -Encoding UTF8 после Get-Content и Out-File даст UTF-8 BOM, а без BOM посложнее.

Всего записей: 838 | Зарегистр. 01-03-2003 | Отправлено: 02:15 01-06-2021 | Исправлено: kraeved, 05:11 01-06-2021
Fenrizz



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

Цитата:
Специализированный инструмент - это замечательно; подозреваю, что программа на чистом Си даже будет несколько шустрее, нежели повершельный аналог. Однако же, повершелл по умолчанию есть на любой винде начиная с Vista - в отличие от инструмента, который требуется либо распространять совместно со скриптом, либо скачивать отдельно каждый раз при запуске на новой машине...  

В целом согласен, но тут зависит от дополнительных требований к переносимости и совместимости, например, вариант с jq будет работать под Линуксом (с небольшими изменениями), а с PowerShell - нет.

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 07:29 01-06-2021
Falcon99



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В смежной теме уже задавал вопрос по данному скрипту, теперь решил здесь. Плюс вопрос немного другой.
Написал скрипт, который используя утилиту imagemagick convert, конвертирует файлы tif в png8.
Скрипт имеет следующий вид:

Код:
::Turn of displaying the code on the screen
cls
@echo off
set "convert=c:\Temp\Imagemagick\convert.exe"
set "in_dir=c:\Temp\ImageMagick\in_png"
set "out_dir=c:\Temp\ImageMagick\out_png"
set "log=c:\Temp\Imagemagick\log.txt"
set "errlog=c:\Temp\Imagemagick\error_log.txt"
:: Удаляем логи
if exist %log% del %log% /q
if exist %errlog% del %errlog% /q
:: Перебираем файлы tif во входящем каталоге
for %%f in ("%in_dir%\*.tif") do call :CNT "%%f"
exit /b
 
:CNT
@echo "Started conversion file %~n1"
:: Получаем дату создания файла
set good_process=""
set dt=%~t1
set dt=%dt:~0,10%
:: Если в выходном каталоге нет файла с таким же именем, то обрабатываем
if exist "%out_dir%\%~n1.png" goto :eof
:: Конвертируем файл во временный каталог
   start /wait "" "%convert%" "%~1" -alpha off PNG8:"%temp%\%~n1.png" >> %log% && set /a good_process="1" || set /a good_process="0"
:: Если без ошибок то  
if %good_process% EQU 1 (
:: Перемещаем файл из временного каталога в выходной и задаем время создания равное исходному файлу
        move "%temp%\%~n1.png" "%out_dir%"
:: Задаем всех значений даты на время создания исходного файла
        setdate.exe -d "%out_dir%\%~n1.png" %dt%
    ) else (
:: Если есть ошибки то пишем в лог имя файла вызвавшего ошибку
@echo "%DATE% %TIME:~0,8% %~n1 error converted" >> %errlog%
)
goto :eof

Иногда при конвертации возникают ошибки, для этого добавил запись работы в логи.
Но к сожалению на выходе получаю пустые файлы.  
В чем я "накосячил"?
 
P.s. Изначально call не использовался, но столкнулся с тем что не могу получить значения переменных, поэтому пришлось перейти к такой структуре скрипта.

Всего записей: 590 | Зарегистр. 12-10-2005 | Отправлено: 10:23 01-06-2021 | Исправлено: Falcon99, 10:25 01-06-2021
kraeved



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Falcon99
Приложите хороший и плохой tiff, чтобы работать с конкретикой, а не гадать на кофейной гуще.

Всего записей: 838 | Зарегистр. 01-03-2003 | Отправлено: 10:46 01-06-2021
Falcon99



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

Цитата:
Приложите хороший и плохой tiff, чтобы работать с конкретикой, а не гадать на кофейной гуще.

Мне немного не то надо, не могу понять почему не происходит запись информации в лог файлы.

Всего записей: 590 | Зарегистр. 12-10-2005 | Отправлено: 11:23 01-06-2021
GCRaistlin



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

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

Всего записей: 3099 | Зарегистр. 18-04-2005 | Отправлено: 11:33 01-06-2021
Falcon99



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Меня интересует почему не пишет в лог строчка:

Код:
start /wait "" "%convert%" "%~1" -alpha off PNG8:"%temp%\%~n1.png" >> %log% && set /a good_process="1" || set /a good_process="0"  

Как заменить ее через echo, я не понимаю.

Всего записей: 590 | Зарегистр. 12-10-2005 | Отправлено: 11:38 01-06-2021 | Исправлено: Falcon99, 11:43 01-06-2021
GCRaistlin



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

Код:
start /wait "" "%convert%" чего-то там

уходил в лог. Вот и замените эту команду на echo и посмотрите, попадет ли что-нибудь в лог. Кстати, от "start /wait" никакого проку нет.

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

Всего записей: 3099 | Зарегистр. 18-04-2005 | Отправлено: 11:45 01-06-2021
lexapass



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Falcon99
Если просто запустить convert.exe c одним файлом .tif с указанными параметрами чисто для проверки, то при успешной конверсии никакого вывода нет, поэтому и в логе пусто. Судя по описанию выводятся только предупреждения и ошибки (можно отключить с -quiet) ...

Всего записей: 550 | Зарегистр. 11-10-2004 | Отправлено: 11:53 01-06-2021
Falcon99



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Т.е. вы предлагаете привести ее к строчке?  

Код:
 echo "%convert%" "%~1" -alpha off PNG8:"%temp%\%~n1.png" >> %log% && set /a good_process="1" || set /a good_process="0"  

 

Цитата:
 Кстати, от "start /wait" никакого проку нет.

Сделал так чтобы гарантированно не получался параллельный запуск утилиты convert, т.к. файлы не маленькие и процесс конвертации занимает по паре минут.

Всего записей: 590 | Зарегистр. 12-10-2005 | Отправлено: 11:55 01-06-2021
Smitis



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

Цитата:
Меня интересует почему не пишет в лог строчка:
start /wait "" "%convert%" "%~1" -alpha off PNG8:"%temp%\%~n1.png" >> %log% && set /a good_process="1" || set /a good_process="0"  

Перенаправление вывода >> работает только для командного процессора. То есть, надо либо start /wait "" %comspec% /c "%convert%" (и далее), но тогда переменная good_process потеряется, либо вообще убрать start
 
Добавлено:

Цитата:
Сделал так чтобы гарантированно не получался параллельный запуск утилиты convert

Она консольная, параллельного запуска не будет.

----------
Разум когда-нибудь победит

Всего записей: 2435 | Зарегистр. 09-02-2003 | Отправлено: 12:00 01-06-2021 | Исправлено: Smitis, 12:08 01-06-2021
Falcon99



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Понял, привел строку к виду:

Код:
"%convert%" "%~1" -alpha off PNG8:"%temp%\%~n1.png" >> %log% && set /a good_process="1" || set /a good_process="0"

Лог все равно чистый.
 
Добавлено:
Буду писать лог через запуск батника с параметром лога, на подобии:

Код:
1.bat >> log.txt  

Всего записей: 590 | Зарегистр. 12-10-2005 | Отправлено: 12:14 01-06-2021
Fenrizz



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

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

 
А на экран он сообщения об ошибках выводит? Надо тогда stderr тоже в файл перенаправлять
command ... 2>>%log%
или command ... 1>>%log% 2>&1

Всего записей: 410 | Зарегистр. 12-09-2017 | Отправлено: 13:22 01-06-2021 | Исправлено: Fenrizz, 06:38 02-06-2021
Falcon99



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
Вы правы.
Нашел в документации:

Цитата:
As a consequence of this feature, textual output is usually written to stderr instead of stdout. For example: if you want to redirect the textual output of Compare to a text file, you would have to write

Код:
compare -metric PSNR 1.png 2.png dif_1_2.png 2>result.txt

So you have to redirect stderr ("2>") to the text file, not stdout ("1>" or just ">").  

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

Код:
"%convert%" "%~1" -alpha off PNG8:"%temp%\%~n1.png" 2>>%errlog% && set /a good_process="1" || set /a good_process="0"

То он отрабатывает один файл и закрывается, т.е не идет на цикл. Почему вообще не понятно.  
Поэтому наверное все-таки не буду мучаться, а просто смотреть какие файлы не были после скрипта отработаны и их обрабатывать отдельно.

Всего записей: 590 | Зарегистр. 12-10-2005 | Отправлено: 13:37 01-06-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