[Quote]

    nikzzzz
  • 215
  • Longevity: 10 years
  • Posts: 3114
  • REPUTATION:127

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

[Quote]

    Ander_73
  • 15549
  • Longevity: 8 years 10 months
  • Posts: 4134
  • REPUTATION: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 ограничено)

[Quote]

    loban_ser
  • 17796
  • Longevity: 7 years 9 months
  • Posts: 577
  • REPUTATION: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

[Quote]

    MinskHard
  • 16618
  • Longevity: 8 years 3 months
  • Posts: 7
  • REPUTATION:-1

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

[Quote]

    vovan1982
  • 214
  • Longevity: 10 years
  • Posts: 1176
  • REPUTATION:81

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


Last edited by vovan1982 on 2019-07-13 22:52; edited 1 time in total

[Quote]

    MinskHard
  • 16618
  • Longevity: 8 years 3 months
  • Posts: 7
  • REPUTATION:-1

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

[Quote]

    Ander_73
  • 15549
  • Longevity: 8 years 10 months
  • Posts: 4134
  • REPUTATION: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"


Last edited by Ander_73 on 2021-02-13 09:07; edited 1 time in total

[Quote]

    UserX
  • 667
  • Longevity: 10 years
  • Posts: 866
  • REPUTATION:44

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

[Quote]

    Ander_73
  • 15549
  • Longevity: 8 years 10 months
  • Posts: 4134
  • REPUTATION:127

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

[Quote]

    Ander_73
  • 15549
  • Longevity: 8 years 10 months
  • Posts: 4134
  • REPUTATION: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.

[Quote]

    loban_ser
  • 17796
  • Longevity: 7 years 9 months
  • Posts: 577
  • REPUTATION: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))"

[Quote]

    Ander_73
  • 15549
  • Longevity: 8 years 10 months
  • Posts: 4134
  • REPUTATION:127

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

[Quote]

    loban_ser
  • 17796
  • Longevity: 7 years 9 months
  • Posts: 577
  • REPUTATION: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))


Last edited by loban_ser on 2021-12-18 11:04; edited 3 times in total

[Quote]

    Ander_73
  • 15549
  • Longevity: 8 years 10 months
  • Posts: 4134
  • REPUTATION: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

[Quote]

    loban_ser
  • 17796
  • Longevity: 7 years 9 months
  • Posts: 577
  • REPUTATION: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

Page 6 of 8


Display posts:    

Current time is: 05-Dec 10:41

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum