Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Регистрация и разрегистрация DLL одним bat (http://forum.oszone.net/showthread.php?t=327764)

Sisin 21-06-2017 10:15 2746263

Регистрация и разрегистрация DLL одним bat
 
Уважаемые, как прописать в одном bat регистрацию и разрегистрацию DLL??
т.е. при запуске проверяется зарегистрирована ли DLL, если да - разрегистрировать, если нет - зарегистрировать.

greg zakharov 21-06-2017 10:44 2746283

Sisin, если известен GUID этой DLL'ки:
Код:

reg query HKCR\CLSID |>nul findstr /irc:"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"&&regsvr32 /u dll_name||regsvr32 dll_name
Примерно так. Как таковых средств (по крайней мере штатных) для проверки была ли DLL зарегистрирована в системе поросту нет.

Iska 21-06-2017 10:44 2746284

Sisin, не вижу простого способа сделать это, равно как и просто определить — возможна ли вообще регистрация, используя только средства пакетных файлов.

y-- 21-06-2017 11:47 2746309

Sisin
так как regsvr32 есть штатно на виндовых системах то имеем:
Код:

@ECHO OFF
SET "MY_DLL=mydll.dll"
regsvr32 "%MY_DLL%" /u /s||regsvr32 "%MY_DLL%" /s

а смысла проверять состояние нет - проще его переключить на противоположное ;)

yurfed 21-06-2017 12:05 2746315

Sisin, вам обязательно батник, или можно через контекстное меню по файлику?
Как добавить регистрацию dll в контекстное меню
OCX, DLL
Код:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\dllfile\Shell]

[HKEY_CLASSES_ROOT\dllfile\Shell\Регистрация]

[HKEY_CLASSES_ROOT\dllfile\Shell\Регистрация\command]
@="regsvr32.exe \"%1\""

[HKEY_CLASSES_ROOT\dllfile\Shell\Отмена регистрации]

[HKEY_CLASSES_ROOT\dllfile\Shell\Отмена регистрации\command]
@="regsvr32.exe /u \"%1\""

[HKEY_CLASSES_ROOT\ocxfile\Shell]

[HKEY_CLASSES_ROOT\ocxfile\Shell\Регистрация]

[HKEY_CLASSES_ROOT\ocxfile\Shell\Регистрация\command]
@="regsvr32.exe \"%1\""


Iska 21-06-2017 12:08 2746318

y--, «regsvr32 "…" /u» даёт errorlevel 0, независимо от того, была регистрация до вызова утилиты или нет.

yurfed, он хочет то же самое, но одной строкой меню, а не двумя разными.

yurfed 21-06-2017 12:12 2746324

Цитата:

Цитата Iska
он хочет »

Ну пусть хочет, пока не помогут :)

y-- 21-06-2017 12:21 2746334

Iska,
написанный код был перепроверен несколько раз... Работает. При проверки рабочести рекомендую удалить ключ "/s"

yurfed 21-06-2017 12:22 2746335

Цитата:

Цитата y--
рекомендую удалить ключ "/s" »

Зачем? Тихий режим, без вопросов.

y-- 21-06-2017 12:24 2746336

yurfed
для наглядности отладки при проверке...

alpap 21-06-2017 12:40 2746346

Sisin,
может так?
Код:

@echo off
set "sPath=%SystemRoot%\System32\regsvr32.exe"
::if not "%Processor_Architecture%"=="x86" set "sPath=%systemRoot%\SysWoW64\regsvr32.exe"
set "xDLL=C:\Windows\system32\ntshrui.dll"
call :prov "%xDll%"
pause& exit

:prov
 reg query "HKEY_CLASSES_ROOT\CLSID" /s /f "InprocServer32" /k /ve|>nul find /i "%~nx1" && (
  echo Зарегистрирована [%sPath% /u "%xDll%"]
 ) || (
  echo Не зарегистрирована [%sPath% "%xDll%"]
 )
exit /b


greg zakharov 21-06-2017 12:41 2746348

Тронул гусляр струны и понеслись девчата в пляс...

Sisin 21-06-2017 13:09 2746368

Цитата:

Цитата alpap
может так? »

Я же должен свою dll только тут вписать: set "xDLL=XXX.dll"????

Iska 21-06-2017 13:41 2746379

Цитата:

Цитата y--
написанный код был перепроверен несколько раз... Работает. »

Цитата:

Цитата y--
для наглядности отладки при проверке... »

У меня — так:
Скрытый текст

То есть, конечным результатом Вашего кода:
Код:

regsvr32 "%MY_DLL%" /u /s||regsvr32 "%MY_DLL%" /s
всегда будет отмена регистрации библиотеки, зарегистрировать её никогда не получится.

Windows 7 x64.

alpap 21-06-2017 14:00 2746385

Цитата:

Цитата Sisin
только тут вписать: set "xDLL= »

да, с полным путем к ней

Sisin 21-06-2017 14:19 2746400

Цитата:

Цитата alpap
да, с полным путем к ней »

А как сделать с неполным? (т.е. dll лежат в папке с bat) И чтобы не одна dll, а две регистрировались/разрегистрировались??

Прошу прощения, за мои излишние хотелки...

alpap 21-06-2017 14:31 2746405

Sisin,
проверил - все это чепуха, никакой разницы в реестре нет между снимком до регистрации и после или наоборот, значит определить зарегистрирован (или нет) файл нельзя, а значит и остальная петрушка до лампочки, только жесткие команды, надо регистрировать - регистрируем, или unregister.

y-- 21-06-2017 14:35 2746407

Iska
так трудно выполнить
Код:

regsvr32 "%MY_DLL%" /u||regsvr32 "%MY_DLL%"
три раза подряд для одной и той же DLL? И внимательно почитать результаты выполнения в графических окошках...

Iska 21-06-2017 14:58 2746419

y--, выполнил раз. Выполнил два. Выполнил три. И даже четыре. Внимательно почитал. Каждый раз одно и то же:



и только. А у Вас?

y-- 21-06-2017 15:42 2746435

Iska
Запускаю отладочный скрипт "от имени администратора" такого содержания:
Код:

@ECHO OFF
SET "MY_DLL=C:\Program Files (x86)\1cv8\8.3.9.2170\bin\comcntr.dll"
regsvr32 "%MY_DLL%" /u||regsvr32 "%MY_DLL%"

ось - Win2012 R2, начальное состояние библиотеки - зарегистрирована
первый запуск два всплывающих окна:

и

второй запуск одно окно:

Далее все по циклу...

Iska 21-06-2017 15:51 2746440

Покажите результат исполнения под:
Цитата:

Цитата y--
ось - Win2012 R2 »

Код:

regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.9.2170\bin\comcntr.dll" /u /s && echo Errorlevel is 0 || Errorlevel NOT 0
для случаев ещё не зарегистрированной библиотекой и с уже зарегистрированной библиотекой. Похоже, что версия regsvr32.exe под указанной ОС отличается поведением кодов возврата при дерегистрации библиотеки.

y-- 21-06-2017 16:03 2746448

Iska
выполнял такой код:
Код:

regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.9.2170\bin\comcntr.dll" /u /s && echo Errorlevel is 0 ||echo Errorlevel NOT 0
в исходном не хватает ECHO

Для зарегистрированной библиотеки:
Код:

C:\Program Files (x86)\1cv8\8.3.9.2170\bin>regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.9.2170\bin\comcntr.dll" /u /s  && echo Errorlevel is 0  || echo Errorlevel NOT 0
Errorlevel NOT 0

Для незарегистрированной библиотеки:
Код:

C:\Program Files (x86)\1cv8\8.3.9.2170\bin>regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.9.2170\bin\comcntr.dll" /u /s  && echo Errorlevel is 0  || echo Errorlevel NOT 0
Errorlevel is 0


Iska 21-06-2017 16:13 2746453

Цитата:

Цитата y--
в исходном не хватает ECHO »

Позор на мою седую голову :(. Приношу Вам свои извинения.

Цитата:

Цитата y--
Для зарегистрированной библиотеки: »

Вот так :). Поведение regsvr32.exe в новой ОС изменилось. Ещё бы кто-нибудь под 8.0/2012 проверил, дабы понять, когда изменилось.

y-- 21-06-2017 16:17 2746458

Iska
На Win7 поведение другое - Unreg всегда выдает успех...
А так 2012 - тот же 8.1 по ядру - значит 8.0 проверять надо...

Iska 21-06-2017 16:30 2746462

Цитата:

Цитата y--
А так 2012 - тот же 8.1 по ядру »

2012 R2 — 8.1. Просто 2012 — да, 8.0:
Цитата:

Цитата y--
значит 8.0 проверять надо... »


BKPB 25-06-2017 17:24 2747204

Идеальный вариант для контекстного меню был бы на подобие этого скрипта
т.к в контекстном меню будет одна строка и значение её будет меняться в зависимости от результата.
Только здесь пункт в меню прописан для рабочего стола и папок, а сделать как в предложенном .bat
только для .dll
Скрытый текст
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
' Если скрипт запущен с каким-то параметром, то...
If WScript.Arguments.Count>0 Then
' Проверяем значение в реестре и в зависимости от него либо отображаем скрытые папки, либо наоборот убираем.
If WSHShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowSuperHidden") = 1 then
' Скрываем папки
WSHShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowSuperHidden", "0", "REG_DWORD"
WSHShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Hidden", "2", "REG_DWORD"
' Добавляем пункт в контекстное меню
' В поле command прописываем путь до текущего скрипта с параметром (не важно каким, главное, чтобы он был), чтобы..
' ..скрипт понял, что ему нужно не удалить ветку реестра, а изменить
WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden\", "Показать скрытые файлы", "REG_SZ"
WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden\command\", "WScript.exe """&WScript.ScriptFullName&""" -argument", "REG_SZ"
' Обновляем окно эксплорера, чтобы увидеть результат
WSHShell.SendKeys "{F5}"
Else
' Скрываем папки
WSHShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowSuperHidden", "1", "REG_DWORD"
WSHShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Hidden", "1", "REG_DWORD"
' Добавляем пункт в контекстное меню
WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden\", "Не показывать скрытые файлы", "REG_SZ"
WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden\command\", "WScript.exe """&WScript.ScriptFullName&""" -argument", "REG_SZ"
' Обновляем окно эксплорера, чтобы увидеть результат
WSHShell.SendKeys "{F5}"
End If
Else
' Если запись в реестре есть, то удаляем наш раздел
If WSHShell.Run("cmd.exe /C REG QUERY ""HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden""", 0, True)=0 Then
WSHShell.Run "cmd /C REG DELETE ""HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden"" /f", 0
Else
' Иначе запускаем этот скрипт с параметром (какой параметр - значения не имеет, главное его наличие)
WSHShell.Run """"&WScript.ScriptFullName&""" -argument"
' И ещё добавим иконочку для красоты
WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\SuperHidden\Icon", "%SystemRoot%\System32\shell32.dll,69", "REG_SZ"
End If
End if
Set WSHShell = Nothing
WScript.Quit(0)


Время: 02:04.

Время: 02:04.
© OSzone.net 2001-