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

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

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

Maz (20-06-2024 22:42): Командная строка, батники, сценарии - bat, cmd (7 часть)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 193 194 195 196 197 198 199 200 201

   

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

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



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

Цитата:
Спасибо! А почему более функционально?  

В смысле функционального стиля программирования
 
Ничего не надо ставить - мой код сравнивает вывод hostname с строкой "Kondor" - если совпадает - выводит на экран и выполняет следующий команды, если нет - завершает выполнение batch-файла.  
Можно вместо || exit /B поставить && Goto метка
 

Код:
echo | hostname | findstr /I /X "Kondor" && goto Kondor
echo | hostname | findstr /I /X "Masha" && goto Masha
echo | hostname | findstr /I /X "Ivan" && goto Ivan
 

Всего записей: 689 | Зарегистр. 12-09-2017 | Отправлено: 17:23 23-03-2021 | Исправлено: Fenrizz, 17:47 23-03-2021
Songbird



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
Понятно. Ещё раз большое спасибо!

Всего записей: 78 | Зарегистр. 06-08-2020 | Отправлено: 19:36 23-03-2021
lyolik r

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Какой параметр следует заменить в строке, что б помимо файлов перемещались и каталоги, спасибо
 

Цитата:
 
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\NirSoft\nircmdc.exe execmd md
"%O" & for /f "usebackq delims=" %%# in (`type %WL`) do move "%%#" "%O\"
syncui.dll,11
Переместить выбранные файлы в каталог|с базовым именем объекта под курсором
 
 
-1
 
 

Всего записей: 462 | Зарегистр. 26-05-2012 | Отправлено: 21:13 23-03-2021
Krasovskii



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

Всего записей: 1374 | Зарегистр. 27-11-2014 | Отправлено: 06:42 24-03-2021
Mr_Hat



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужна помощь уважаемого сообщества в нетривиальной задаче.
Цель:  получить командным путём имя текущего wifi соединения SSID
Уточнение, не всех сохраненных в ос, а именно текущей.
Я так мониторю наличие связи, через зацикленный пинг на конкретный адрес,
 
но так как wifi сетей боле 3, а качеством связи они разнятся,
имеется необходимость, в том же окне консоли периодически получать SSID  подключенной сети.
 
Подскажите плз, как это возможно реализовать!
 
(актуально для win7 и дальше)  
 
,

Всего записей: 985 | Зарегистр. 04-10-2005 | Отправлено: 05:45 26-03-2021
Fenrizz



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mr_Hat
https://www.reddit.com/r/PowerShell/comments/432yh1/command_to_check_connected_ssid/
 
netsh wlan show interfaces  
или в PowerShell
(get-netconnectionProfile).Name

Всего записей: 689 | Зарегистр. 12-09-2017 | Отправлено: 06:13 26-03-2021 | Исправлено: Fenrizz, 06:16 26-03-2021
ewild

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Предположим, имеется текстовый файл (скажем, "x_blocks_of_variables.txt"), содержащий структурированные наборы переменных:

Код:
 
v0=text_string_45
va=000000 111111
vb=222111 444555 000123
vn=325142 986524
vx=656888 753951
vz=486258 874623 457820
 
v0=text_string_124
va=000022 222111 986524
vb=222133 000123
vn=425145
vx=156888
vz=086289 874623 457820 753951
 
... и так далее десятки-сотни раз

 
Блоки разделены пустыми строками, блоков может быть десятки-сотни.
 
Структура всегда блоков неизменна, системно и циклично повторяется.
В одном блоке всегда:
Шесть одинаково именованных и последовательно расположенных переменных,
в их числе одна (первая) текстовая (всякий раз изменяется) и за ней (ниже) пять переменных с набором числовых групп "шестизначное число""пробел""шестизначное число" (сами числа и число их групп вский раз разные, в том числе пустыми)
 
Эти блоки предназначены для вставки в шаблонный .cmd файл для обработки:

Код:
 
set v0=text_string_45
set va=000000 111111
set vb=222111 444555 000123
set vn=325142 986524
set vx=656888 753951
set vz=486258 874623 457820
:: упрощенно, для примера:  
for %%v in (%va%) do echo %%v
:: и дак далее по каждому набору  
 

 
Таким образом, имеется два варианта экстенсивного использования:
а. На основе шаблонного изготовить десятки-сотни файлов .cmd (по числу блоков).
б. Изготовить один общий .cmd файл-портянку, включающий все блоки.
 
Вопрос, можно ли сделать процедуру интенсивной:
создать исполнительный .cmd, который бы парсил "x_blocks_of_variables.txt" и по очереди извлекая из него блоки переменных осуществлял обработку до тех пор пока эти блоки не закончатся? Или в рамках .cmd задача неосуществима (чрезмерно сложна)?
 
Спасибо

Всего записей: 1203 | Зарегистр. 13-08-2005 | Отправлено: 15:54 30-03-2021
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ewild,
а разбить файл x_blocks_of_variables.txt на несколько каждый из которых будет содержать блок из 6 строк и "скармливать" шаблонному *.cmd это неподходящее решение?

Всего записей: 7697 | Зарегистр. 08-09-2001 | Отправлено: 16:27 30-03-2021
ewild

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los,
Ха, думаю такое разбитие-скармливание (и все ж это можно сделать на лету, в том числе разбивку во временное хранилище и последующее удаление разбивки за ненадобностью), - вполне подходящее и довольно изящное для данного случая решение!
Спасибо!

Всего записей: 1203 | Зарегистр. 13-08-2005 | Отправлено: 16:46 30-03-2021
Fenrizz



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ewild
При определённых допущениях (что количество и имена переменных в каждом блоке всегда одинаковые) получается типа того
 

Код:
@echo off
setlocal EnableDelayedExpansion
 
FOR /F "tokens=1* delims==" %%G IN (blocks.txt) DO (
if /I "%%G"=="v0" set v0=%%H  
if /I "%%G"=="va" set va=%%H
if /I "%%G"=="vb" set vb=%%H
if /I "%%G"=="vn" set vn=%%H
if /I "%%G"=="vx" set vx=%%H
if /I "%%G"=="vz" (set vz=%%H  
echo !v0!, !va!, !vb!, !vn!, !vx!, !vz!  
ДЕЛАЕМ ЧТО-ТО ) )  

Всего записей: 689 | Зарегистр. 12-09-2017 | Отправлено: 20:57 30-03-2021 | Исправлено: Fenrizz, 21:00 30-03-2021
ewild

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los,
Fenrizz,
 
Спасибо.
 
Сделал пока так (рассматривается по блокам):
 
1. Начальный блок выполняет предподготовку исходного текста с переменными (здесь "vars_text.txt")
NB как выяснилось, пустые строки иногда пляшут, поэтому избавляемся от них, получая во временном файле ("tempo.txt") во временном хранилище ("tempo") копию исходного файла в виде сплошного строкового текста с данными без пропусков.  
 

Код:
@echo off
 
:: make sure there's an empty temporary storage
if exist tempo del /f /q /s tempo\* > nul
if not exist tempo md tempo
:: make temporary text copy of vars, full but blank lines
findstr /v "^$" vars_text.txt > tempo\tempo.txt

 
2. Во втором блоке делим единый файл-текст с переменными на множество файлов (сколько получится по исходному содержимому) по шесть строк (по числу переменных) во временном хранилище.
NB эта часть мне не очень нравится, но свою работу она делает;
включение и выключение здесь setlocal enabledelayedexpansion и endlocal опускать нельзя, иначе работать правильно не будет
   

Код:
 
:: until vars text is not empty split it by 6 lines into tempo\i.txt, then delete temporary files
set "chs=6"
set "n=tempo"& set "x=txt"
:split
set/a j+=1
setlocal enabledelayedexpansion
<"tempo\%n%%i%.%x%">nul find/v "" || (del "tempo\%n%%i%.%x%"& goto deal)
<"tempo\%n%%i%.%x%">"tempo\%j%.%x%" (for /f "delims=" %%i in ('more') do @set/a c+=1& if !c! leq %chs% echo %%i)
<"tempo\%n%%i%.%x%">"tempo\%n%%j%.%x%" (more +%chs%)& del "tempo\%n%%i%.%x%"
endlocal
set/a i+=1& goto split
:deal

 
3. В следующем блоке обрабатывается каждый файл (полученный на предыдущем шаге) из множества во временном хранилище.
Берется один такой файл и каждая его строка (имеющая формат "имя_переменной"="значение_переменной" либо "имя_переменной"="набор значений этой переменной") поочередно извлекается и собственно используется для задания (set) своего содержимого в качестве переменной (var_name=value).
После этого наступает счастливый момент возможностти работы с этими переменными (здесь в примере они просто выводятся на экран: echo !переменная!).
Далее берется следующий файл, и так далее до счастливого финала.

Код:
Setlocal EnableDelayedExpansion
:: deal with tempo\i.txt to get variables
:: get file name to process
for %%d in (tempo\*) do (set vartext=%%d
echo !vartext!
:: one by one get each line of a file being processed and set it as variable
for /f "tokens=*" %%v in (!vartext!) do (set %%v)
:: process variables (echoing them as an example here)
echo !v0!
echo !va!
echo !vb!
echo !vn!
echo !vx!
echo !vz!
)

 
4. Финальный блок
Временное хранилище со всем содержимым удаляется.  
(перед этим, в примере, - становимся на паузу чтобы посмотреть полученную красоту; в финальной версии - без паузы)
 

Код:
 
:: finalizing
echo:
echo Press any key to clean up and exit
pause  >nul
 
:: delete all temporary entries
if exist tempo del /f /q /s tempo > nul
if exist tempo rd  /s /q    tempo > nul
:: repeat because rd is sometimes buggy
if exist tempo rd  /s /q    tempo > nul
 
exit/b

Всего записей: 1203 | Зарегистр. 13-08-2005 | Отправлено: 13:19 31-03-2021 | Исправлено: ewild, 13:32 31-03-2021
Fenrizz



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ewild
Я не совсем понял, зачем нужны первые 2 пункта?  
Мой вариант работает и без них - обрабатывает файл и выполняет пункт ДЕЛАЕМ ЧТО-ТО для каждого блока.

Всего записей: 689 | Зарегистр. 12-09-2017 | Отправлено: 13:24 31-03-2021 | Исправлено: Fenrizz, 13:25 31-03-2021
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте, ewild
Зачем ТАК?

Код:
 
setlocal enabledelayedexpansion
for /f "delims=" %%i in (blocks.txt) do (
  ::Заполняем переменне
  set "%%i"
  ::Все заполнены - запускаем скрипт.
  if not "!v0!"=="" if not "!va!"=="" if not "!vb!"=="" if not "!vn!"=="" if not "!vx!"=="" if not "!vz!"=="" call :_script
)
exit /b  
:_script
::Выполняем действия
 
:: Обнуляем переменніе
set "v0=" & set "va=" & set "vb=" & set "vn=" & set "vx=" & set "vz="
exit /b
 

 

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 13:36 31-03-2021
ewild

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

Цитата:
if not "!v0!"=="" if not "!va!"=="" if not "!vb!"=="" if not "!vn!"=="" if not "!vx!"=="" if not "!vz!"=="" call :_script

 
Если я не ошибаюсь, эта часть может не сработать, - переменные могут не всегда иметь какое либо прописанное значение, т.е. могут быть пустыми.
Я этот случай пытался описать в исходном сообщении, правда, как видно, с ошибкой (пропустил "[значения] могут быть")  

Цитата:
(сами числа и число их групп вский раз разные, в том числе пустыми)

 
 

Всего записей: 1203 | Зарегистр. 13-08-2005 | Отправлено: 13:40 31-03-2021 | Исправлено: ewild, 17:28 31-03-2021
yurkesha



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

Всего записей: 2757 | Зарегистр. 15-12-2003 | Отправлено: 14:39 31-03-2021 | Исправлено: yurkesha, 14:39 31-03-2021
ewild

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yurkesha, да, я ошибся в том предположении.
 
Alex_Piggy,
Fenrizz,
отработал все предложенные вами варианты кода.
 
Все скрипты одинаково обрабатывают исходные данные и дают идентичный конечный результат  своей функции подготовки данных для основной программы.
 
Хотя доля скриптов в общем времени исполнения, до начала работы основной программы, минимальна, и быстродействие не так уж принципиально, тем не менее в этой части стоит отметить то очевидное, что мой самый громоздкий скрипт и самый же медленный, заслуживает быть отпавленным в утиль. Скрипты с кодом Fenrizz, Alex_Piggy гораздо более изящны, компактны. Принципиальной разницы между ними не усматривается, но визуально первый отрабатывает чуть быстрее. Пока буду применять оба
 
Большущее вам спасибо!

Всего записей: 1203 | Зарегистр. 13-08-2005 | Отправлено: 17:26 31-03-2021
us0r



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени.
Есть код:

Код:
@echo off
cls
setlocal
echo %~dp0
 
for /f "tokens=* delims=*" %%a in ('echo %~dp0 ^| find /i ^"^\^\^"') do (
    if "%%a"==NUL (echo Local
        ) else (echo Network)
)
 
endlocal
pause

Но ему чёт плохо: при запуске локально, не отрабатывает ветка, где %%a равно пустоте (или %%a=" ", или %%a=""), отрабатывает только ветка, где значение имеет "\\". При этом батник не падает, а просто не выводит никаких значений (даже echo %errorlevel% или просто %errorlevel% не сообщает). Просто как будто её и не существует.
Правильно ли я понимаю, что оно просто проскакивает цикл, т.к. не содержит ни пустого значения, ни "\\", т.е. получается UB и идёт сразу на "pause". Если так, то что оно содержит, как это хотя бы узнать?

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
us0r
Так код  ^| find /i ^"^\^\^" пропускает только строки, которые содержат \\  а остальные - нет и for их просто игнорирует. Зачем тут for нужен я вообще не понял.

Всего записей: 689 | Зарегистр. 12-09-2017 | Отправлено: 14:36 10-04-2021 | Исправлено: Fenrizz, 14:49 10-04-2021
lexapass



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
us0r
Если проверяется факт наличия двойных слэшей, то for не нужен, результат find это покажет:

Код:
...
echo %~dp0 |find "\\" >nul
if errorlevel 1 (echo Local) else (echo Network)
...

Всего записей: 567 | Зарегистр. 11-10-2004 | Отправлено: 14:47 10-04-2021
us0r



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если в строке нет двойного слеша, то что возвращается в %%a? Ничего? Т.е. там пусто? Если там пусто, то при сравнении с NUL или "" оно разве не должно выполнять условие, где %%a==NUL- истина?
Или оно что- то возвращает, но что оно возвращает- непонятно. Более того, если мы сделаем так:

Код:
@echo off
cls
setlocal
echo %~dp0
 
for /f "tokens=* delims=*" %%a in ('echo %~dp0 ^| find /i ^"^\^\^"') do (
    echo Here is %%a value
    if "%%a"==NUL (echo Local
        ) else (echo Network)
)
 
endlocal
pause

То тут мы получим вывод "echo Here is %%a value" только в случае запуска по сети (ну или в тексте найдётся двойной слеш, не суть важно, кмк), хотя, казалось бы, сравнение идёт дальше.
Т.е. мне непонятен этот момент. Поковырявшись ещё, мне понятно только одно: цикл, видимо, завершается (аварийно?), если в %%a вернулось пустое(?) значение. Видимо, баг какой- то.
 
А вдруг мне понадобится, в другом тексте, проверять наличие пустой строки, и делать что- то если найдётся. Или пробегаясь по файлу делать что- то, если что- то нашлось или не нашлось.
 
Fenrizz
Всё так. Вы правы. For здесь просто потому, что я привык так гонять вывод, т.к. у меня много разного бывает и, в каком- то смысле, это уже шаблон. Как умею, так сказать.  
lexapass
Да, я с этим for уже и забывать начал, что можно проще.

Всего записей: 407 | Зарегистр. 06-12-2007 | Отправлено: 16:05 10-04-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 193 194 195 196 197 198 199 200 201

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии - bat, cmd
Maz (20-06-2024 22:42): Командная строка, батники, сценарии - bat, cmd (7 часть)


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru