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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

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

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.10 до Windows 11 +Win95cmd +ReactOS) и command.com (DOS 5.0 и выше). Старые командные процессоры можно запускать на более новых ОС, хотя не всё может работать корректно. Подробная документация по командам cmd.exe и стандартным утилитам ОС для NT 3.51, NT 5.0 (Windows 2000) и NT 5.2 (Windows Server 2003). Сборник представляет исторический интерес, а также незаменим для тех, у кого появилось желание сделать свои скрипты работоспобными не только на своей версии ОС.
 
· Большой сборник одним архивом: Сотни Win32 утилит командной строки, нетривиальные .cmd файлы, .bat miniperl скрипты (не требующие полноценной установки Perl), FAR Manager с плагинами и настройками, разное для DOS/DOSBox (откуда под Win32 интерес представляют три продвинутых "мультисистемных" .bat файла да ещё, может быть, оболочка Necromancer DOS Navigator с поддержкой LFN и доступом к буферу обмена Windows). Краткие описания всего - в файликах files.bbs

Всего записей: 38829 | Зарегистр. 26-02-2002 | Отправлено: 13:35 19-09-2020 | Исправлено: metatrop, 07:55 29-11-2022
syrenium

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Понятно. Таких предупреждений можно до бесконечности выводить. Мне показалось, что одно все-таки желательно. Субъективно.

Всего записей: 671 | Зарегистр. 07-12-2015 | Отправлено: 21:27 15-07-2021
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Также можно выходить не по Ctrl-Break, а при вводе пустого значения. Однако при такой реализации обязательно стирайте переменную до запроса: при вводе пустого значения присвоения не происходит, а кто знает, чему была равна ваша переменная при запуске скрипта.

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

Всего записей: 3999 | Зарегистр. 18-04-2005 | Отправлено: 21:35 15-07-2021
syrenium

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Еще обратил внимание, что если использовать "choice", то тожно ввести только Y или N.
При использовании

Код:
Set /p x="Подтвердите правильность выбора диска: Да (y) или Нет (n)"
if %x%==y goto :M1
if %x%==n goto :M2

Как-то непонятно реагирует на "неправильные" значения (типа d, c  и пр.)

Всего записей: 671 | Зарегистр. 07-12-2015 | Отправлено: 21:46 15-07-2021
GCRaistlin



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

Код:
 
if defined X set X=
:Query
set /p "X=Y or N: "
setlocal enabledelayedexpansion
if /i not !X!==y if /i not !X!==n endlocal & goto :Query
...
 

Delayed expansion включать обязательно, потому что коварный пользователь может ввести, например, "&.

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

Всего записей: 3999 | Зарегистр. 18-04-2005 | Отправлено: 22:00 15-07-2021
kraeved



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

Код:
@echo off  
 
chcp 65001 >nul
set "_title=Вы собираетесь ФОРМАТИРОВАТЬ диск!"
set "_msg=Готовы продолжить?`nНаберите YES и нажмите OK`nИли нажмите Отмена для выхода..."
set "_cmd=add-type -as Microsoft.VisualBasic; if ([Microsoft.VisualBasic.Interaction]::InputBox("""%_msg%""",'%_title%') -cne 'YES'){exit 1}"
powershell -c "%_cmd%" || goto :eof
 
echo Форматируем...

или

Код:
@echo off
 
chcp 65001 >nul
set "_title=Вы собираетесь ФОРМАТИРОВАТЬ диск!"
set "_msg=Готовы продолжить?`nНаберите YES и нажмите OK`nИли нажмите Отмена для выхода..."
set "_cmd=CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(InputBox(Replace(""%_msg%"",""`n"",vbNewLine),""%_title%"")):Close"
for /f "tokens=*" %%# in ('mshta vbscript:Execute("%_cmd%"^)') do set "_input=%%#"
setlocal EnableDelayedExpansion & if "!_input!" neq "YES" goto :eof
 
echo Форматируем...

Всего записей: 1000 | Зарегистр. 01-03-2003 | Отправлено: 13:42 16-07-2021 | Исправлено: kraeved, 06:49 17-07-2021
syrenium

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kraeved
Интересный вариант. Спасибо!
Несколько моментов.
1. Зачем менять кодировку на UTF-8? Я всегда считал, что батники лучше сохранять в кодировке 866, поскольку cmd.exe имеет такую же кодировку.
Со стройкой "chcp 65001 >nul" у меня, соответственно, кракозябры.
2. В случае неправильного ввода можно зацилклить на повторный вызов окна:

Код:
:M1
set "_title=Вы собираетесь ФОРМАТИРОВАТЬ диск!"
set "_msg=Готовы продолжить?`nНаберите YES и нажмите OK`nИли нажмите Отмена для выхода..."
set "_cmd=add-type -as Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::InputBox(""""%_msg%"""", '%_title%')"
for /f "tokens=*" %%# in ('powershell -c "%_cmd%"') do set "_input=%%#"
setlocal EnableDelayedExpansion & if "!_input!" neq "YES" goto :M1
echo Форматируем...
 

Но тогда "Отмена" и закрыть окно (крестик) - не выход. Можно это как-нибудь сделать?
3. Есть какие-нибудь технические отличия использовать powershell или mshta?

Всего записей: 671 | Зарегистр. 07-12-2015 | Отправлено: 18:07 16-07-2021
GCRaistlin



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

Цитата:
батники лучше сохранять в кодировке 866, поскольку cmd.exe имеет такую же кодировку

Это всего лишь кодировка по умолчанию, причем только для русской локали.

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

Всего записей: 3999 | Зарегистр. 18-04-2005 | Отправлено: 18:53 16-07-2021
kraeved



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
syrenium
Задача подтверждения — не мотать нервы, а создать задержку, снижающую вероятность беды.
Если пользователь не может собраться и ввести 3 буквы в поле, где работают клавиши Delete
и Backspace, то уместнее отправить его спать, а не настаивать, показывая окно вновь и вновь.
 
Разъяснять тут преимущества UTF8 — офтопик, но мы пришли к ней, преодолевая ограничения
национальных кодировок. Поэтому в редакторах она зачастую выбрана по умолчанию, а та же
ОС Windows 10 обзавелась галочкой, избавляющей от необходимости вводить chcp 65001.
 
   
 
Если сохранить упомянутый код (возьмите улучшенную версию) в UTF8 (без маркера BOM),
но запустить его в среде chcp 866, то стареющий MSHTA просто не взлетит, а вот PowerShell
выдаст кракозябры. Варианты: или UTF8-файл с chcp 65001, или 866-файл без chcp 65001.
 
Вообще, PowerShell позиционируют как замену cmd. Будучи практиком, я слегка морщусь, ибо
знаком с этими и другими недостатками, на фоне которых хоронить cmd явно преждевременно,
но проект открытый, развивается, уже помогает там-сям. Кстати, умеет работать как diskpart.

Всего записей: 1000 | Зарегистр. 01-03-2003 | Отправлено: 06:02 17-07-2021 | Исправлено: kraeved, 22:25 21-07-2021
kraeved



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

Код:
@echo off
 
rem Если в строке нет позывного, то просим ввести
if "%1"=="" (set /p "_name=Name: ") else (set "_name=%1")
rem Простая проверка позывного: латинские буквы, арабские цифры, подчёркивание
echo %_name%| findstr /r "[^a-Z0-9_]" >nul && (call :error Valid name is required.)
 
:loop
    rem Используем заголовок окна для вывода статуса операции
    title Loading '%_name%'
    rem Пробуем установить связь и выводим ошибку, если не вышло
    call :get canUseCDN || (call :error Cannot access '%_name%'.)
    call :get cdnURL
    rem Если связь есть, но камера занята приватом или выключена, то пробуем снова через 30 сек
    if /i "%_canUseCDN%"=="false" (if defined _cdnURL (call :stream private) else (call :stream offline))
    rem Связь есть, камера доступна, начинаем просмотр и/или запись
    title Playing '%_name%'
    streamlink "%_cdnURL%" best
    rem Если пропала связь или выключилась запись, то пробуем снова через 30 сек
    call :stream terminated
 
:get
    rem Функция для получения данных из внешнего JSON
    for /f %%# in ('powershell -c ^
                    try{(irm httрs://www.xyz.com/rest/%_name% -ea stop^).%1} ^
                    catch{}') do (set "_%1=%%~#")
    exit /b
 
:stream
    rem Функция для переподключения с обратным отсчётом времени
    echo; & echo Stream '%_name%' is %*.
    echo; | set /p "=Trying again soon. Or (r)eload now, (q)uit? "
    for /l %%s in (30,-1,1) do (
        title Waiting '%_name%' %%s
        for /f %%c in ('choice /n /c rq0 /d 0 /t 1') do (
            if /i "%%c"=="r" (echo r & goto :loop)
            if /i "%%c"=="q" (echo q & exit)
        )
    )
    echo r & goto :loop
 
:error
    rem Функция для вывода ошибок
    title Reporting '%_name%'
    echo; & echo Error. %*
    pause
    exit

Всего записей: 1000 | Зарегистр. 01-03-2003 | Отправлено: 11:12 20-07-2021 | Исправлено: kraeved, 13:42 20-07-2021
Rakin_Gornosvistov



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

Цитата:
chcp 65001

А для XP?

Всего записей: 55 | Зарегистр. 10-10-2017 | Отправлено: 09:05 21-07-2021
BorlandIMHO

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

Цитата:
А для XP?

А что с ней не так?..
65001 поддерживается начиная с Win2000.
Другое дело - что на XP по умолчанию нет powershell вообще, и установить можно версию не новее 2.0 (KB968930), и есть ли в ней требуемый для данного скрипта функционал мне неизвестно (а проверять влом ).

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

Всего записей: 2403 | Зарегистр. 12-10-2006 | Отправлено: 09:50 21-07-2021
kraeved



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Совместимость с PowerShell 2, доступной для Windows XP SP3, проверяется ключом -version 2.
Например, работает: powershell -version 2 -c (new-timespan (get-date) 2021-12-31).days #162
Не работает: powershell -version 2 -c irm ident.me #'irm' is not recognized as a cmdlet, function…

Всего записей: 1000 | Зарегистр. 01-03-2003 | Отправлено: 13:29 21-07-2021 | Исправлено: kraeved, 13:33 21-07-2021
Rakin_Gornosvistov



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO, kraeved Спасибо! Понял, что использовать chcp 65001 не стоит, во всяком случае, для моих целей. Когда надо запустить бат файл на чужом компе с XP, будет гемор.

Всего записей: 55 | Зарегистр. 10-10-2017 | Отправлено: 06:24 22-07-2021
meph2k9

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1) Привет, имеется батник, был натравлен на папку с подпапкой в которой 2 файла, при работе почему-то удаляет один исходник без создания выходного, а второй выходной переносит туда откуда был запущен батник (в каком виде должен быть батник чтобы оставлял результат в папке исходных файлов)
 
for /f "tokens=* delims=" %%i in ('dir /a-d/b/s "*.doc"') do (
    if "%%~xi"==".doc" (
        echo %%i
        soffice --convert-to odt "%%i" "%%~dpi%%~ni.odt"
        for %%f in ("%%~dpi%%~ni.odt") do (
            if %%~zi gtr %%~zf (
                del "%%i" /f /q
            ) else (
                del "%%f" /f /q
            )
        )
    )
)
 
2) этот почему-то не удаляет после обработки исходный конкретный файл, что ему не нравится?
 
for %%i in (*.mp3) do (
    echo %%i
    ffmpeg -i "%%i" -c:a libopus -b:a 64k "%%~ni.opus"
    for %%f in ("%%~ni.opus") do (
        if %%~zi gtr %%~zf (
            del "%%i" /f /q
        ) else (
            del "%%f" /f /q
        )
    )
)
 
входной который не удаляется после обработки: https://file.io/YPTQcoyaIHmz

Всего записей: 65 | Зарегистр. 06-11-2008 | Отправлено: 08:55 23-07-2021 | Исправлено: meph2k9, 08:57 23-07-2021
Fenrizz



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
meph2k9
По второму:
 
Это зачем? if %%~zi gtr %%~zf (  
 
И попробуйте прописать полные пути

Код:
for %%i in ("C:\Music\Folder\*.mp3") do (  
    echo %%i
    ffmpeg -i "%%i" -c:a libopus -b:a 64k "C:\Music\Folder\%%~ni.opus"
    for %%f in ("C:\Music\Folder\%%~ni.opus") do (  


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

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
meph2k9
По первому:
1) совершенно излишний первый if, ибо в выдаче 'dir /a-d/b/s "*.doc"' файлов с другим расширением быть не может
2) конструкцию "%%~dpi%%~ni", ИМХО, было бы правильнее записать как "%%~dpni"
Где-то так:
Код:
for /F "usebackq delims=" %%I in (`dir /A-D /B /S "*.doc"`) do (
REM        echo %%I
        "C:\Program Files\LibreOffice\program\soffice.com" --convert-to odt "%%~fI" "%%~dpnI.odt"
        for %%F in ("%%~dpnI.odt") do (
            if %%~zI gtr %%~zF (
                del "%%~fI" /f /q
            ) else (
                del "%%~fF" /f /q
            )
        )
)
(проверено - работает, хотя soffice и ругается на что-то).
Fenrizz

Цитата:
Это зачем?

Насколько я понимаю - конвертация файлов делается для уменьшения размера; соответственно, после конвертации удаляется, в зависимости от того что больше, либо исходник, либо результат; из всего, на чём тестировал - ни одного случая "размер исходника меньше сконвертированного" не выявлено, но не исключаю и такой возможности...

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

Всего записей: 2403 | Зарегистр. 12-10-2006 | Отправлено: 10:03 23-07-2021 | Исправлено: BorlandIMHO, 11:01 23-07-2021
Fenrizz



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

Цитата:
1) совершенно излишний первый if, ибо в выдаче 'dir /a-d/b/s "*.doc"' файлов с другим расширением быть не может

Да и dir /a-d/b/s тоже не нужен, достаточно  

Код:
for %%I in ("C:\Work\Documents\*.doc") do (  


Всего записей: 677 | Зарегистр. 12-09-2017 | Отправлено: 10:53 23-07-2021 | Исправлено: Fenrizz, 10:57 23-07-2021
GCRaistlin



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

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

Всего записей: 3999 | Зарегистр. 18-04-2005 | Отправлено: 11:09 23-07-2021
meph2k9

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

Всего записей: 65 | Зарегистр. 06-11-2008 | Отправлено: 11:47 23-07-2021 | Исправлено: meph2k9, 12:06 23-07-2021
Artem_Butenko



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, пожалуйста помогите реализовать такие концепции:
1.Только для  выделенных исполняемых файлов (случайно выделенные файлы с иным расширением, должны игнорироваться), путём их "перетаскивания" в окно командной строки, создать строковые параметр в системном реестре, согласно пути, - "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers". Полный путь к исполняемому файлу заключать в кавычки нельзя! Пример строкового параметра, - "C:\MyProgram1\MyProgram1.exe", со значением ~ RUNASADMIN (после символа "тильда" пробел обязателен; значение параметра в кавычк заключать нельзя).
 2.Только для  выделенных каталогов и исполняемых файлов в них (все прочие файлы, с иным расширением, должны игнорироваться), путём "перетаскивания" выделенных каталогов в окно командной строки, создать строковые параметр в системном реестре, согласно пути, - "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers". Полный путь к исполняемому файлу заключать в кавычки нельзя! Пример строкового параметра, - "C:\MyProgram\MyProgram1\MyProgram1.exe", со значением ~ RUNASADMIN; "C:\MyProgram\MyProgram2\MyProgram2.exe", со значением ~ RUNASADMIN и т.д. Аналогично первому тезису, после символа "~" перед значением "RUNASADMIN" присутствует пробел! Значение параметра в кавычк заключать нельзя!  
Если можно, то реализовать функцию вывода ошибок для двух примеров.  
Буду Вам очень признателен за добрую помощь.

Всего записей: 711 | Зарегистр. 19-02-2008 | Отправлено: 19:39 23-07-2021 | Исправлено: Artem_Butenko, 20:13 23-07-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 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru