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

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

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



Full 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
 

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



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

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

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
 
 

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



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

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



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

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



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

Всего записей: 433 | Зарегистр. 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 задача неосуществима (чрезмерно сложна)?
 
Спасибо

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

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

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

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

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



Full 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!  
ДЕЛАЕМ ЧТО-ТО ) )  

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

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



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

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

 

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

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

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

 
 

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



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

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

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

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



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". Если так, то что оно содержит, как это хотя бы узнать?

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



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

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

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



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 уже и забывать начал, что можно проще.

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

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