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

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Благодарю! Всё функционирует "сходу, из каропки "
И в этом случае, как я понимаю, нет необходимости "в длинном и нудном бэкапе", если файл не изменялся - зачем? И это логично.
А можно ещё в таком случае это "в цикл" засунуть? Скажем, с выполнением раз в час. Или - 2-а. Просто юзер на том ПК "совершенно бесправный", а админа "найти никак не могут" - у HR требования явно неадекватные...
В общем, вполне бы устроило, если бы пользователь сам запустил этот bat-файл (без планировщика), и файл бы в течении дня "отслеживал изменения", и скопировал бы изменённый файл к пользователю на ПК...
А на другой день пускай уже запускает по-новой...

Всего записей: 1102 | Зарегистр. 11-01-2019 | Отправлено: 15:53 21-03-2023
BorlandIMHO

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

Цитата:
можно ещё в таком случае это "в цикл" засунуть? Скажем, с выполнением раз в час.

Запросто. Но идея - плохая. "Забыл запустить", "случайно закрыл!", "оно само повисло, а я не заметил!" и куча других отмазок...
Если нужно надёжно и без случайностей - назначенное задание на powershell вешается на сервере, где лежит файл; оно вешает хук на событие "изменение файла" и делает копию при каждом изменении, хоть 10 раз в секунду. {Сейчас я такое рисовать не готов, если нужно - просите тут}
Цыкл "раз в час" (3600 секунд):

Код:
@echo OFF
set "OBJECT=\\Server\path to\file.ext"
set "TARGET_PATH=z:\Path to\target\folder"
 
:Inception
for /F "usebackq tokens=*" %%A in (`powershell -command "(gci '%OBJECT%').LastWriteTime.ToString('yyyy-MM-dd_HH-mm-ss')"`) do set "LWT=%%A"
for %%B in ("%OBJECT%") do (
    if NOT EXIST "%TARGET_PATH%\%%~nB_%LWT%%%~xB" echo F| xcopy "%OBJECT%" "%TARGET_PATH%\%%~nB_%LWT%%%~xB"
)
timeout /T 3600 /NOBREAK
goto :Inception
 



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

Всего записей: 2612 | Зарегистр. 12-10-2006 | Отправлено: 17:18 21-03-2023
generator324

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

Цитата:
Запросто. Но идея - плохая. "Забыл запустить", "случайно закрыл!", "оно само повисло, а я не заметил!" и куча других отмазок...  

Знаю. Но это уже совсем от полной безвыходности... Потому, что то, что придумал я - ещё хуже )).

Цитата:
Цыкл "раз в час" (3600 секунд):  

Т.е. это будет "раз в час" запускать копирование? То, что надо! Сейчас "под'уменьшу" до 6-ти минут и буду пробовать. Чтобы уж совсем "хренью не страдать" )). Я про свой вариант.
Спасибо Вам Огромное!  
Что до "Забыл запустить", "случайно закрыл!" и т.п. - там человек "кровно заинтересован" : он написал макрос, который парсит .xls-файл для "совместной работы". Админа сейчас в конторе нету (осталась полузаблокированная "прежняя роскошь", управляемая удалённо из другого города - AD), и вот какая-то Гнида повадилась этот .xls-файл регулярно "херить", а там - вся их дневная "наработка". Вот и приходится изгаляться, "как умеем"...
 
P.S.  Вполне устроит "ваш вариант", если бы ещё можно было избавиться сразу от:

Код:
Время ожидания ...сек., Нажмите Ctrl+C для выхода

Всего записей: 1102 | Зарегистр. 11-01-2019 | Отправлено: 17:45 21-03-2023
BorlandIMHO

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

Цитата:
если бы ещё можно было избавиться сразу от

1>nul 2>&1 timeout /T 3600 /NOBREAK
 
Добавлено:

Цитата:
какая-то Гнида повадилась этот .xls-файл регулярно "херить"

А вот для ловли "гниды" нужно вешать аудит на доступ к файлам, опять же на сервере. И "гниду" наказывать...

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

Всего записей: 2612 | Зарегистр. 12-10-2006 | Отправлено: 17:58 21-03-2023
generator324

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

Цитата:
А вот для ловли "гниды" нужно вешать аудит на доступ к файлам, опять же на сервере. И "гниду" наказывать...

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

Всего записей: 1102 | Зарегистр. 11-01-2019 | Отправлено: 18:12 21-03-2023 | Исправлено: generator324, 18:13 21-03-2023
korosya

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите, пожалуйста, по поиску текста в строке. Есть файл, первой строке среди текста есть запись вида  
package="нужный_текст"
Как получить нужный_текст? Вокруг нужный_текст точно стоят кавычки, перед - точно package=, все это точно в первой строке файла.

Всего записей: 1008 | Зарегистр. 19-07-2003 | Отправлено: 19:08 22-03-2023
bytie

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

Код:
package="([^"]+)"

Раз такие вводные, то просто захватываем всё, что между кавычками. Выражение захвата — любые символы, кроме самих кавычек)

Всего записей: 299 | Зарегистр. 18-08-2005 | Отправлено: 20:55 22-03-2023
Fenrizz



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

Код:
@echo off
Set /P _MyVar=<MyFilename.txt
Set "%_MyVar%"
Echo %package%
REM Без кавычек
Echo %package:~1,-1%

 
Хотя, тут смотря что понимать под словом "среди текста"? Можете привести пример первой строки?

Всего записей: 689 | Зарегистр. 12-09-2017 | Отправлено: 05:38 23-03-2023 | Исправлено: Fenrizz, 05:48 23-03-2023
fscpsd



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Цитата:
for /F "usebackq tokens=*" %%A in (`powershell -command "(gci '%OBJECT%').LastWriteTime.ToString('yyyy-MM-dd_HH-mm-ss')"`) do set "LWT=%%A"

Справедливости ради (раз уж мы находимся в теме про cmd) стоит сказать, что это можно было и без повершелла сделать, вот так:
Код:
for %%A in ("%OBJECT%") do set raw_LWT=%%~tA
set LWT=%raw_LWT:~6,4%-%raw_LWT:~3,2%-%raw_LWT:~0,2%_%raw_LWT:~11,2%-%raw_LWT:~14,2%
Получится то же самое, только будет два маленьких недостатка: нельзя получить секунды и формат таймштампа зависит от региональных настроек. Зато работать пошустрее будет, поскольку не нужно повершелл вызывать.
 
 
 
Добавлено:
korosya
Цитата:
Есть файл, первой строке среди текста есть запись вида  
package="нужный_текст"
Как получить нужный_текст?
Ещё вариант:
Код:
@echo OFF
setlocal
set _myfile=F:\tmp\file-to-parse.txt
for /F "usebackq delims=" %%A in ("%_myfile%") do (
    set _1ststr=%%A
    goto EndLoop
)
:EndLoop
for /F "tokens=2 delims==" %%B in ("%_1ststr%") do (set _alltoken=%%B)
set _token-wo-quotes=%_alltoken:~1,-1%
echo %_token-wo-quotes%

Всего записей: 1939 | Зарегистр. 16-09-2010 | Отправлено: 06:19 23-03-2023 | Исправлено: fscpsd, 06:45 23-03-2023
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
korosya
Может быть это xml? Для него есть специальные средства, а не текстовые (удобнее).

Всего записей: 12799 | Зарегистр. 11-03-2002 | Отправлено: 06:38 23-03-2023
BorlandIMHO

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

Цитата:
Справедливости ради...

Ну, пош там задействован именно из-за рег. настроек, а не потому что я про "%~tA" не в курсе.  
А скоростью выполнения в данном случае можно пренебречь, ибо копируем 1 файл, а не 1000.
 

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

Всего записей: 2612 | Зарегистр. 12-10-2006 | Отправлено: 09:29 23-03-2023
fscpsd



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Цитата:
Ну, пош там задействован именно из-за рег. настроек, а не потому что я про "%~tA" не в курсе.
Это понятно, да. Просто я подумал, что вдруг вы параллельно ещё и ведёте подрывную пропаганду, переманиваете пользователей из нашего старообрядчества в свою новую секту повершелла. Вот поэтому и сказал, что cmd тоже умеет почти то же самое, поэтому из-за таких мелочей не стоит предавать старую веру отцов и дедов.

Цитата:
скоростью выполнения в данном случае можно пренебречь, ибо копируем 1 файл, а не 1000
Пренебречь-то, конечно, можно, но всё-таки непорядок. У меня на семёрке каждая итерация заметно подтормаживает на каждом вызове повершелла. На первом вызове вообще секунды на 3 задумывается и аж винтом шуршит, а дальше по полсекунды где-то. Возможно, в Вин10 это более гладко работает, но у меня так.

Всего записей: 1939 | Зарегистр. 16-09-2010 | Отправлено: 10:24 23-03-2023
korosya

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

Цитата:
Хотя, тут смотря что понимать под словом "среди текста"? Можете привести пример первой строки?

<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:compileSdkVersion="30" android:compileSdkVersionCodename="11" android:sharedUserId="android.uid.system" coreApp="true" package="com.android.systemui" platformBuildVersionCode="30" platformBuildVersionName="11">
Вот полностью первая строка. Надо добыть com.android.systemui
 
bytie

Цитата:
package="([^"]+)"

А куда в батник это регексп вставлять?
 
fscpsd
Спасибо. Но скрипт отлавливает первый знак "=", а надо - после слова package
 
Pasha_ZZZ

Цитата:
Может быть это xml? Для него есть специальные средства, а не текстовые (удобнее).

Да, это xml. Как специальными средствами передать в батник значение package?

Всего записей: 1008 | Зарегистр. 19-07-2003 | Отправлено: 11:27 23-03-2023
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
korosya
Можно использовать xmlstarlet или даже встроенный в cmd js или vbs. Передать как обычно - через for /f ....

Всего записей: 12799 | Зарегистр. 11-03-2002 | Отправлено: 11:48 23-03-2023
korosya

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

Цитата:
Можно использовать xmlstarlet или даже встроенный в cmd js или vbs

А как это сделать в js?

Всего записей: 1008 | Зарегистр. 19-07-2003 | Отправлено: 14:58 23-03-2023
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
korosya
Желательно бы увидеть полный xml или он секретный?

Всего записей: 12799 | Зарегистр. 11-03-2002 | Отправлено: 15:32 23-03-2023
Inoz2000



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Зачем этот полный? Нужна лишь одна строка.

Всего записей: 5220 | Зарегистр. 23-04-2009 | Отправлено: 15:46 23-03-2023
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Inoz2000
Необязательно одна строка. Полный всегда лучше, чем неполный. Нужна как минимум вложенность тэгов и атрибуты.

Всего записей: 12799 | Зарегистр. 11-03-2002 | Отправлено: 16:12 23-03-2023
ewild

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

Цитата:
Да, это xml. Как специальными средствами передать в батник значение package?

 
 
test.xml:

Код:
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:compileSdkVersion="30" android:compileSdkVersionCodename="11" android:sharedUserId="android.uid.system" coreApp="true" package="com.android.systemui" platformBuildVersionCode="30" platformBuildVersionName="11"></manifest>

ETA: </manifest> for valid xml
 
test.cmd:

Код:
@echo off
 
for /f "tokens=21 delims== " %%i in ('find "package=" "test.xml"') do set "package=%%i"
 
call :dequote package
echo %package%
goto :wait
 
:dequote
for /f "delims=" %%a in ('echo %%%1%%') do set %1=%%~a
exit/b
 
:wait
pause

Всего записей: 1203 | Зарегистр. 13-08-2005 | Отправлено: 16:42 23-03-2023 | Исправлено: ewild, 01:41 24-03-2023
korosya

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

Цитата:
Необязательно одна строка. Полный всегда лучше, чем неполный. Нужна как минимум вложенность тэгов и атрибуты.

Да ничего секретного. Это файл из андроидовской апкашки. Вот пример (чтобы не засорять - под ковриком
 
ewild
Огромное спасибо - получилось.
Но я дико извиняюсь - я понял, что задуманное не получится сделать батником (в переменную должна попадать слишком длинная текстовая строка и она не проходит). Поэтому придется переходить на VBScript. Можно ли на нем получить это же значение package? Еще раз прошу прощения за свои метания.

Всего записей: 1008 | Зарегистр. 19-07-2003 | Отправлено: 18:49 23-03-2023 | Исправлено: korosya, 11:20 24-03-2023
   

Страницы: 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