[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Ander_73
Ждет, результат можно проверить по %errorlevel% .

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
Как под Win7 получить список содержимого ESD-архива? "Родной" DISM не поддерживает такой формат. Есть замечательная утилита wimlib, но она не понимает русские буквы в тэгах...
После вдумчивого гугленья получен VBS-скрипт (назовём его xml_parser.vbs):
Set oXML = CreateObject("Msxml2.DOMDocument")
oXML.Load(WScript.Arguments(0))
Set nodes = oXML.getElementsByTagName(WScript.Arguments(1))
For Each node In nodes
WScript.Echo node.text
Next
И теперь можно так:
:: получаем из ESD-архива (%file%) содержимое файла-описания в файл xml
wimlib-imagex.exe info "%file%" --extract-xml xml
:: получаем список тэгов <NAME> и записываем в файл list.txt в кодировке 1251 (для WSelect)
for /f "delims=" %%i in ('cscript.exe //nologo xml_parser.vbs xml NAME') do call :getitem
>nul chcp 866
exit
:getitem
if not defined cp >nul chcp 1251& set cp=1
:: трюк с передачей параметра через внутреннюю переменную; позволяет вывести _любые_ символы, в т.ч. кавычки и спец-символы
for %%a in (1) do >>list.txt echo %%i

*Примечание:
  • работает также с WIM и SWM (всё, что поддерживает wimlib)
  • вывести можно список любых тэгов, а не только <NAME>
  • требуется поддержка vbs (применение под WinPE ограничено)

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
Делал как-то для себя батник, исключительно для удобства тестирования WinPE:
@echo off
cd /d "%~dp0"
If Exist "%~dp0BCD" del /f /q "%~dp0BCD"
for %%I in (*.wim) do call :creat %%~nI %%~nxI
del /q /f /ah "%~dp0*.log" 2>nul 1>&2
Goto eof
:creat
set BCD=bcdedit.exe /store "%~dp0BCD"
If DEFINED %1 goto eof
If NoT Exist "%~dp0BCD" (bcdedit /createstore "%~dp0BCD" 2>nul 1>&2
for /f "tokens=2 delims={}" %%a in ('%BCD% /create {bootmgr} /d "Windows Boot Manager"') do (
      %BCD% /set {%%a} inherit {globalsettings} 2>nul 1>&2
      %BCD% /set {%%a} locale ru_RU 2>nul 1>&2
      %BCD% /set {%%a} PrereleaseSignatures yes 2>nul 1>&2
      %BCD% /set {%%a} nointegritychecks yes 2>nul 1>&2
      %BCD% /set {%%a} loadoptions DDISABLE_INTEGRITY_CHECKS 2>nul 1>&2
      %BCD% /set {%%a} fontpath \_WIM\BOOT\Fonts 2>nul 1>&2
      %BCD% /set {%%a} Timeout 30 2>nul 1>&2
      %BCD% /set {%%a} DisplayOrder {current} 2>nul 1>&2
    )
If Exist "%~dp0BOOT\memtest.exe" (
for /f "tokens=2 delims={}" %%i in ('%BCD% /create {memdiag} /d "Диагностика памяти"') do (
    %BCD% /set {%%i} Device boot 2>nul 1>&2
    %BCD% /set {%%i} Path \_WIM\BOOT\memtest.exe 2>nul 1>&2
    %BCD% /set {%%i} inherit {globalsettings} 2>nul 1>&2
    %BCD% /set {%%i} nointegritychecks yes 2>nul 1>&2
    %BCD% /set {%%i} BadMemoryAccess yes 2>nul 1>&2
    %BCD% /set {%%i} loadoptions DDISABLE_INTEGRITY_CHECKS 2>nul 1>&2
    %BCD% /set {bootmgr} ToolsDisplayOrder {memdiag} 2>nul 1>&2
  )
)
for /f "tokens=2 delims={}" %%j in ('%BCD% /create {ramdiskoptions}') do (
    %BCD% /set {%%j} ramdisksdidevice Boot 2>nul 1>&2
    %BCD% /set {%%j} ramdisksdipath \_WIM\BOOT\boot.sdi 2>nul 1>&2
)
for /f "tokens=2 delims={}" %%k in ('%BCD% /create {bootloadersettings}') do (
    %BCD% /set {%%k} fontpath \_WIM\BOOT\Fonts 2>nul 1>&2
    %BCD% /set {%%k} inherit {globalsettings} 2>nul 1>&2
)
)
for /f "tokens=2 delims={}" %%b in ('%BCD% /create /d ">>> %1" /application osloader') do (
     %BCD% /set {%%b} osdevice ramdisk=[boot]\_WIM\%2,{ramdiskoptions} 2>nul 1>&2
     %BCD% /set {%%b} inherit {globalsettings} 2>nul 1>&2
     %BCD% /set {%%b} locale ru-RU 2>nul 1>&2
     %BCD% /set {%%b} nointegritychecks yes 2>nul 1>&2
     %BCD% /set {%%b} testsigning yes 2>nul 1>&2
     %BCD% /set {%%b} bootmenupolicy legacy 2>nul 1>&2
     %BCD% /set {%%b} loadoptions DDISABLE_INTEGRITY_CHECKS 2>nul 1>&2
     %BCD% /set {%%b} detecthal yes 2>nul 1>&2
     %BCD% /set {%%b} winpe yes 2>nul 1>&2
     %BCD% /set {%%b} path "\Windows\system32\boot\winload.exe" 2>nul 1>&2
     %BCD% /set {%%b} device ramdisk=[boot]\_WIM\%2,{ramdiskoptions} 2>nul 1>&2
     %BCD% /set {%%b} systemroot "\Windows" 2>nul 1>&2
     %BCD% /displayorder {%%b} /addlast 2>nul 1>&2
     %BCD% /set {%%b} nx OptIn 2>nul 1>&2
)
exit /b
Думаю в пояснении не нуждается.
Как использовать:
К примеру имеется двухраздельная флэшка или USB-HDD, создаем папку _WIM на любом разделе вашего накопителя, закидываем свои образы (*.wim) в папку _WIM, запускаем батник auto.bat, будет создан файл BCD, запускаем из Grub4Dos-меню из пункта: "Авто-меню запуска образов из папки _WIM"

Пример:
title  >>> Авто-меню запуска образов из папки _WIM \n По этому пункту будет создано меню загрузки образов.
find --ignore-floppies /_WIM/BOOT/Bootmgr | set p=
chainloader %p%/_WIM/BOOT/GRLDR
Ну а дальше все как по шаблону:

Вообще вот набор, если кому интересно.
aa

[Цитировать]

    MinskHard
  • 16618
  • Стаж: 6 лет 7 месяцев
  • Сообщений: 7
  • Репутация:-1

    [+] [-]
Уважаемые"Гуру" помню где-то видел обсуждали но найти не могу. В шапке есть батник для запуска программы из искомой папки. Код отрабатывает на ура, папку ищет и необходимый exe-ник запускает вот только окно консоли висит пока не закроешь эту программу или саму консоль.
Дописывал в конец кода :end, exit ничего не помогает, подскажите пожалуйста, или тыкните носом где обсуждали это !

[Цитировать]

    vovan1982
  • 214
  • Стаж: 9 лет 2 месяца
  • Сообщений: 1098
  • Репутация:76

    [+] [-]
  • Откуда: Ростов-на-Дону
MinskHard, так вы параметр /w (ждать завершения выполнения) уберите
start /w %PUH%\wind\setup64.cmd
Нужно так
start %PUH%\wind\setup64.cmd


Последний раз редактировалось: vovan1982 (2019-07-13 22:52), всего редактировалось 1 раз

[Цитировать]

    MinskHard
  • 16618
  • Стаж: 6 лет 7 месяцев
  • Сообщений: 7
  • Репутация:-1

    [+] [-]
Огромное спасибо, всё получилось !

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
Интересный способ определить битность файла (exe или dll):
@echo off
for /f "tokens=3" %%a in ('2^>nul 7z.exe l -tpe %1^| find "CPU = "') do ^
if "%%a"=="x86" (echo App is a x86) else if "%%a"=="x64" echo App is a x64

Нужно:
- установленный 7z (или прописанный в PATH)
- запуск: run.cmd "file_name.exe"


Последний раз редактировалось: Ander_73 (2021-02-13 09:07), всего редактировалось 1 раз

[Цитировать]

    UserX
  • 667
  • Стаж: 8 лет 11 месяцев
  • Сообщений: 788
  • Репутация:32

    [+] [-]
83262Интересный способ определить битность файла (exe или dll):
Чисто теоретически этот код допускает не увидеть никакого из двух сообщений - "App is a x86" или "App is a x64".
Такое возможно практически?

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
UserX, только сейчас заметил, что да af
Если подсунуть батнику sfx-архив самого 7z. Обойти легко: добавить ключ -tpe
... 7z.exe l -tpe %1 ...

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
Ковырялся с мини-сборкой Xemom1 и обнаружил, что он использует BCD из прошлых своих сборок с массой лишних пунктов меню. Поэкспериментировал с созданием BCD "с нуля" для запуска одиночного WIM-файла из произвольной папки. Вот, что у меня получилось:

Минимально рабочий BCD

bcdedit /createstore BCD
set b=bcdedit /store BCD
set s=%b% /set {default}
%b% /create {bootmgr}
%b% /set {bootmgr} nointegritychecks Yes
%b% /set {bootmgr} fontpath \PE10\Fonts
%b% /create {ramdiskoptions}
%b% /set {ramdiskoptions} ramdisksdidevice boot
%b% /set {ramdiskoptions} ramdisksdipath \PE10\boot.sdi
for /f "tokens=2 delims={}" %%a in ('%b% /create /d "" /application osloader') do %b% /default {%%a}
%s% device ramdisk=[boot]\PE10\1064.wim,{ramdiskoptions}
%s% path \Windows\System32\Boot\winload.exe
%s% osdevice ramdisk=[boot]\PE10\1064.wim,{ramdiskoptions}
%s% systemroot \Windows
%s% winpe Yes
%s% nx OptIn
%s% testsigning Yes

Ключ testsigning - опциональный (Xemom1 его использует у себя, значит, пусть будет).
Для модификации "под себя", путь \PE10 заменить на свой (не забыть про папку для ключа fontpath и имя самого WIM-файла).
*Примечание: сборка BCD производилась под Win10.

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
Нужно было как-то получить доступ к ветке реестра, написал батничек для смены владельца и получения прав для Администраторы / Пользователи / System

reg_acces.bat

@Echo off
for /f "tokens=3" %%a in (
'2^>nul reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v ACP'
) do >nul 2>&1 chcp %%a
cd /d %~dp0
@(mshta "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"& echo.)>>"out.txt"
for /f "tokens=1 delims=" %%a in (out.txt) do set "f=%%a"
del /q /f "out.txt"
set "reg=%f:~-3%"
If Not Exist "%APPDATA%\Repozitory" md "%APPDATA%\Repozitory"
rem Создание резервной копии прав на раздел
SetACL.exe -on "%f%" -ignoreerr -ot reg -actn list -lst "w:o,d,s,g;f:sddl" -bckp "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp" -rec cont_obj
rem Смена владельца раздела
rem Получение прав полного доступа для текущего пользователя
SetACL.exe -on "%f%" -ignoreerr -ot reg -actn setowner -ownr "n:S-1-5-32-544" -actn ace -ace "n:S-1-5-32-545;p:full" -ace "n:S-1-5-18;p:full" -rec cont_obj -actn clear -clr "dacl,sacl" -actn rstchldrn -rst "dacl,sacl" |find /i "SetACL finished successfully."
If %errorlevel% LSS 1 (
%windir%\system32\cAu3.exe "MsgBox('64','Внимание!','Полными владельцами:' & @CRLF & '%f%' & @CRLF & 'установлены:  Администраторы / Пользователи / System',10)"
)
Exit
Ну и восстановление прав

Restore_reg_acces.bat

@Echo off
for /f "tokens=3" %%a in (
'2^>nul reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v ACP'
) do >nul 2>&1 chcp %%a
cd /d "%~dp0"
@(mshta "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"& echo.)>>"out.txt"
for /f "tokens=1 delims=" %%a in (out.txt) do set "f=%%a"
del /q /f "out.txt"
set "reg=%f:~-3%"
If Exist "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp" (
rem Восстановление владельца и прав из резервной копии
SetACL.exe -on "%f%" -ignoreerr -ot reg -actn restore -bckp "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp" -rec cont_obj -silent
SetACL.exe -on "%f%" -ot reg -actn setprot -op dacl:np -silent
SetACL.exe -on "%f%" -ot reg -actn clear -clr dacl,sacl -silent
If %errorlevel% LSS 1 (
%windir%\system32\cAu3.exe "MsgBox('64','Внимание!','Права на куст:' & @CRLF & '%f%' & @CRLF & 'Восстановлены!',10)"
del /q /f "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp"
)
)
Exit /B
требует дополнительных утилит SetACL и cAu3-консольный autoit
добавил в контекстное меню

reg

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Background\shell\reg_owner]
"SubCommands"="reg_owner_act;reg_owner_rest"
"MUIVerb"="Права ветки реестра"
"Icon"="Regedit.exe,-0"
"Position"="1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\reg_owner_act]
@="Смена владельца раздела"
"HasLUAShield"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\reg_owner_act\command]
@="mshta.exe vbscript:close(CreateObject(\"Shell.Application\").ShellExecute(\"cmd\",\"/c C:\\Windows\\System32\\reg_acces.bat\",\"\",\"runas\",0))"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\reg_owner_rest]
@="Восстановление владельца и прав из резервной копии"
"HasLUAShield"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\reg_owner_rest\command]
@="mshta.exe vbscript:close(CreateObject(\"Shell.Application\").ShellExecute(\"cmd\",\"/c C:\\Windows\\System32\\Restore_reg_acces.bat\",\"\",\"runas\",0))"

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
loban_ser, зачем нужен cAu3? Используй тот же VBS. Всего-то надо вывести одно инфо-окно.

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
Ander_73,
Я привык уже к нему, он "облегчает жизнь"
функционал расширен чем у cmd, по этому и пользую, а так-то конечно можно
mshta vbscript:close(CreateObject("wscript.shell").Popup("test"^&vbCrLf^&"test",,"test",^&H20))
mshta vbscript:close(CreateObject("wscript.shell").Popup("Полными владельцами:"^&vbCrLf^&"%f%"^&vbCrLf^&"установлены:  Администраторы / Пользователи / System",,"Внимание!",64))
mshta vbscript:close(CreateObject("wscript.shell").Popup("Права на куст:"^&vbCrLf^&"%f%"^&vbCrLf^&"Восстановлены!",,"Внимание!",64))


Последний раз редактировалось: loban_ser (2021-12-18 11:04), всего редактировалось 3 раз(а)

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
loban_ser, и таки временные файлы надо создавать в %tmp%, кмк. Да и просто он не нужен
for /f "delims=" %%a in (
'mshta "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"'
) do echo %%a
И с find можно красиво через &&, а не проверять ерролевел.
И md сразу фигачить через 2>nul, а не проверять наличие.
Ворчу... ab

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
@Echo off
for /f "tokens=3" %%a in (
'2^>nul reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v ACP'
) do >nul 2>&1 chcp %%a
cd /d %~dp0
for /f "delims=" %%a in (
'mshta "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"'
) do set "f=%%a"
set "reg=%f:~-3%"
2>nul md "%APPDATA%\Repozitory"
rem Создание резервной копии прав на раздел
SetACL.exe -on "%f%" -ignoreerr -ot reg -actn list -lst "w:o,d,s,g;f:sddl" -bckp "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp" -rec cont_obj
rem Смена владельца раздела
rem Получение прав полного доступа для текущего пользователя
SetACL.exe -on "%f%" -ignoreerr -ot reg -actn setowner -ownr "n:S-1-5-32-544" -actn ace -ace "n:S-1-5-32-545;p:full" -ace "n:S-1-5-18;p:full" -rec cont_obj -actn clear -clr "dacl,sacl" -actn rstchldrn -rst "dacl,sacl" |find /i "SetACL finished successfully." && mshta vbscript:close(CreateObject("wscript.shell").Popup("Полными владельцами:"^&vbCrLf^&"%f%"^&vbCrLf^&"установлены:  Администраторы / Пользователи / System",,"Внимание!",64))
Exit
@Echo off
for /f "tokens=3" %%a in (
'2^>nul reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v ACP'
) do >nul 2>&1 chcp %%a
cd /d "%~dp0"
for /f "delims=" %%a in (
'mshta "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"'
) do set "f=%%a"
set "reg=%f:~-3%"
If Exist "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp" (
rem Восстановление владельца и прав из резервной копии
SetACL.exe -on "%f%" -ignoreerr -ot reg -actn restore -bckp "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp" -rec cont_obj -silent
SetACL.exe -on "%f%" -ot reg -actn setprot -op dacl:np -silent
SetACL.exe -on "%f%" -ot reg -actn clear -clr dacl,sacl |find /i "SetACL finished successfully." && mshta vbscript:close^(CreateObject^("wscript.shell"^).Popup^("Права на куст:"^&vbCrLf^&"%f%"^&vbCrLf^&"Восстановлены!",,"Внимание!",64^)^)
del /q /f "%APPDATA%\Repozitory\%reg:\=_%_quick_access_acl.bkp"
)
Exit

Страница 6 из 8


Показать сообщения:    

Текущее время: 28-Мар 12:32

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы