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

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

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

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

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

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

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



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

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

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

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

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

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

Всего записей: 528 | Зарегистр. 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

Всего записей: 3147 | Зарегистр. 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 Форматируем...

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

Full 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?

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



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

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

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

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

Всего записей: 3147 | Зарегистр. 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.

Всего записей: 838 | Зарегистр. 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

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



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

Цитата:
chcp 65001

А для XP?

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

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

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

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

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

Всего записей: 1274 | Зарегистр. 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…

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



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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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

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



Full 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 (  


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

Advanced 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

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



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

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

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

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


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



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

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

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

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

Всего записей: 25 | Зарегистр. 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" присутствует пробел! Значение параметра в кавычк заключать нельзя!  
Если можно, то реализовать функцию вывода ошибок для двух примеров.  
Буду Вам очень признателен за добрую помощь.

Всего записей: 662 | Зарегистр. 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

Компьютерный форум 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

Рейтинг.ru