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

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

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

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

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



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

Код:
xmllint.exe --xpath string(//manifest/@package) file.xml  

 
или  
 
https://github.com/npocmaka/batch.scripts/blob/master/hybrids/jscript/xpath.bat

Код:
call xpath.bat file.xml "//manifest/@package"

Всего записей: 677 | Зарегистр. 12-09-2017 | Отправлено: 19:54 23-03-2023 | Исправлено: Fenrizz, 19:59 23-03-2023
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
All
Для парсинга XML просто-таки напрашивается powershell.

Код:
@echo OFF
set "XML=x:\path to\your.xml"
for /F "usebackq" %%A in (`powershell -command "[xml]$a=(gc '%XML%');$a.manifest.package"`) do set "PACKAGE_CONTENT=%%~A"
echo %PACKAGE_CONTENT%
pause


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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 23:35 23-03-2023 | Исправлено: BorlandIMHO, 20:32 24-03-2023
ewild

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

Код:
@echo off
set "xml=test.xml"
powershell [xml]$a=(gc "%xml%");$a.manifest.package;set "package=$a"
%package%
pause

 

Цитата:
не работает

 
BorlandIMHO

Всего записей: 1194 | Зарегистр. 13-08-2005 | Отправлено: 01:38 24-03-2023 | Исправлено: ewild, 02:30 24-03-2023
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ewild
Неа...
Ибо set у вас не работает:

Код:
@echo off
set "xml=test.xml"
powershell [xml]$a=(gc "%xml%");$a.manifest.package;set "package=$a"
echo package is: %package%
pause



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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 01:54 24-03-2023
korosya

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

Всего записей: 1005 | Зарегистр. 19-07-2003 | Отправлено: 14:27 24-03-2023
ewild

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
test1.xml (with package="com.android.systemui.test1"):

Код:
<?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.test1" platformBuildVersionCode="30" platformBuildVersionName="11"></manifest>

 
test2.xml (with package="com.android.systemui.test2"):

Код:
<?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.test2" platformBuildVersionCode="30" platformBuildVersionName="11"></manifest>

 
test.ps1 (PowerShell):

Код:
### get each .xml file in a path
$xml = Get-ChildItem -path "." -filter *.xml -Recurse
### for each .xml file:
foreach ($file in $xml) {
### - parse content with the [xml] type accelerator
[xml]$content = Get-Content $file
### - get <manifest> element and assign its 'package' attribute value to $package variable
$package = $content.manifest.package
### - display $package variable
$package
}
pause

 
Example output:

Код:
com.android.systemui.test1
com.android.systemui.test2

Всего записей: 1194 | Зарегистр. 13-08-2005 | Отправлено: 10:54 25-03-2023 | Исправлено: ewild, 11:10 25-03-2023
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача, - вытащить GUID из BCD файла загрузчика в переменную. В винде работает, в winPE не хочет.
Можно как-то обойтись без findstr.exe и без 1.txt?
 

Код:
for /f "tokens=1 delims=" %%a in ('bcdedit.exe^|findstr.exe/s "resumeobject"') do echo %%a>1.txt  
for /F "tokens=2 delims={}" %%i in (1.txt) do set resumeobject={%%i}
echo.resumeobject: %resumeobject%  
del 1.txt

Всего записей: 11531 | Зарегистр. 30-04-2006 | Отправлено: 08:18 26-03-2023 | Исправлено: shok, 08:19 26-03-2023
Inoz2000



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот у меня команда bcdedit.exe|find "resumeobject" выдаёт 4 строки
 
Добавлено:
try this
for /f "tokens=2" %%a in ('bcdedit.exe^|find "resumeobject"') do @echo %%a
 
Добавлено:
и вариант без скобок
for /f "tokens=2 delims={}" %%a in ('bcdedit.exe^|find "resumeobject"') do @echo %%a

----------
Мы все умрём. (-:

Всего записей: 4891 | Зарегистр. 23-04-2009 | Отправлено: 08:25 26-03-2023
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shok
Без промежуточного текстовика - запросто, вместо findstr можно воспользоваться find

Код:
for /F "usebackq tokens=1,2" %%A in (`bcdedit^|find /I "resumeobject"`) do set "%%A=%%B"
echo resumeobject is: %resumeobject%
pause

Другой вопрос, что resumeobject в выхлопе bcdedit встречается {как минимум} 2 раза, и у меня нет уверенности, что он во всех случаях одинаков...
Если нужно только последнее значение - всё в порядке, если критерий выбора нужного другой - надо думать...
 
(Картинка снята с WinPE 11 на виртуалке)

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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 08:42 26-03-2023 | Исправлено: BorlandIMHO, 08:47 26-03-2023
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Inoz2000
 
так нормально, проверю в PE

Код:
 
for /f "tokens=2 delims={}" %%a in ('bcdedit.exe^|find "resumeobject"') do set guid={%%a}
echo %guid%

Всего записей: 11531 | Зарегистр. 30-04-2006 | Отправлено: 08:43 26-03-2023
Inoz2000



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

Цитата:
и у меня нет уверенности, что он во всех случаях одинаков
ниукого её нет
Цитата:
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность


----------
Мы все умрём. (-:

Всего записей: 4891 | Зарегистр. 23-04-2009 | Отправлено: 08:45 26-03-2023
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Inoz2000
BorlandIMHO
Счвс встрою в скрипт, проверю и отпишусь.
 
add
 
Всё получилось. поправил (дописал значения) сон комьютера)
 

Всего записей: 11531 | Зарегистр. 30-04-2006 | Отправлено: 08:46 26-03-2023 | Исправлено: shok, 09:11 26-03-2023
BorlandIMHO

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

Цитата:
Его главная особенность — уникальность

Имелось в виду - совпадение в пределах выдаваемого за 1 прогон bcdedit.
(см. картинку).
То, что GUID как бы уникален - следует из его определения...
 
Проверять влом, но сильно подозреваю, что при мультизагрузке {несколько ОС} у каждой из позиций будет свой GUID и в выдаче bcdedit будет не менее 3-х resumeobject...

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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 09:10 26-03-2023 | Исправлено: BorlandIMHO, 09:18 26-03-2023
fscpsd



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

korosya
Цитата:
ewild
Цитата:
Огромное спасибо - получилось.

Поясните, плз, кому не лень, как это работает? Непонятно, зачем аргументом вызова call сделана текстовая строка "package", и почему в цикле for вокруг аргумента "%1" столько лишних симвоволов "%" — как это всё работает?

Всего записей: 1731 | Зарегистр. 16-09-2010 | Отправлено: 05:22 27-03-2023 | Исправлено: fscpsd, 05:23 27-03-2023
BorlandIMHO

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

Цитата:
зачем аргументом вызова call сделана текстовая строка "package"

Типа "как у взрослых".
В подпрограмму передаётся имя переменной, для вящей универсальности. Чтобы одна и та же подпрограмма могла изменять разные переменные в одной программе (а не повторять одну и туже подпрограмму для нескольких переменных).  
В данном случае, ИМХО - излишество, однако концепт имеет право на существование.
Где-то в старых "батниковых" темах была ссылка на целый пакет подпрограмм в таком стиле, сейчас не могу найти...

Цитата:
почему в цикле for вокруг аргумента "%1" столько лишних симвоволов "%"

По определению.
Следствие передачи переменной по имени, а не по значению...
В подпрограмме "%1" {замечу, что тогда уж правильнее было бы %~1} - обращение к имени переменной. А чтобы обратиться к её значению - приходится добавлять те самые "лишние %". Причём учитывая, что для батника % нужно удваивать. Вот так и получается, что в подпрограмме чтобы получить значение {%package%} приходится заключать в "%%" параметр "%1": %%%1%%.

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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 11:51 27-03-2023 | Исправлено: BorlandIMHO, 11:52 27-03-2023
GCRaistlin



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

Цитата:
Типа "как у взрослых"

Если использовать костыли, ваяя громоздкое и тормозное решение, - это "как у взрослых", тогда да. Мы, дети, делаем несколько проще:

Код:
 
for /f "tokens=21 delims== " %%i in ('find "package=" "test.xml"') do set package=%%i
setlocal enabledelayedexpansion || exit /b
for /f "usebackq delims=" %%A in ('!package:^"^=!') do (
  endlocal
  set package=%%A
)
echo %package%
 

 
Добавлено:
А если нужно убрать только обрамляющие, что и делает та подпрограмма, то вообще

Код:
 
for /f "tokens=21 delims== " %%i in ('find "package=" "test.xml"') do set package=%%~i
echo %package%
 


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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 12:11 27-03-2023 | Исправлено: GCRaistlin, 12:12 27-03-2023
BorlandIMHO

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

Цитата:
использовать костыли, ваяя громоздкое и тормозное решение

Парсинг xml в "голом" cmd - вообще весьма сомнительная затея.
В силу особенностей формата...
 
А обсуждаемый {совершенно излишний в данной ситуации} хак с передачей в подпрограмму имени переменной имеет, в принципе, право на существование, если необходимо однотипно обработать одной подпрограммой несколько разных переменных.
Я так понимаю, ewild просто проверял концепцию {ну, или хотел похвастаться умением }.
Я тоже такое делал, имея в виду что может понадобиться получить 2 и более временнЫе метки (STARTTIME и ENDTIME, например) и вывести их в одной строке...


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

Всего записей: 2388 | Зарегистр. 12-10-2006 | Отправлено: 13:58 27-03-2023 | Исправлено: BorlandIMHO, 14:00 27-03-2023
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Я имел в виду в первую очередь то самое нагромождение процентов.

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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 14:06 27-03-2023
Alexyz21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
for %f in (*.*) do echo %f:~-3%
Ожидаю увидеть последние 3 символа имени файла (ext), но вижу name.ext:~-3%
Как правильно написать?

Всего записей: 3471 | Зарегистр. 16-06-2007 | Отправлено: 09:12 28-03-2023
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexyz21
Цитата:
Ожидаю увидеть последние 3 символа имени файла (ext)

Получить расширение можно так:
Код:
for %f in (*.*) do @echo %~xf

Но выведется еще и точка... Если без точки, то батником:

Код:
for %%f in (*.*) do call :cut %%~xf
goto :eof
:cut
set "var=%~1"
set "var=%var:~-3%"
echo %var%
exit /b
 

Всего записей: 288 | Зарегистр. 19-05-2006 | Отправлено: 10:11 28-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

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