PDA

Показать полную графическую версию : Копирование, регистрация и удаление библиотек


Toltec
01-12-2009, 15:54
Здравствуйте, подскажите пожалуйста как решить такую задачу:
Есть папка в которой лежит proga.ехе и 10 штук dll-ок (1.dll, 2.dll,...10.dll)
8 из 10 dll-ок нужно скопировать в папку "%windir%\system32" и 6 из 8-ми скопированных зарегистрировать командой regsvr32 /s 1.dll, regsvr32 /s 2.dll, и т.д.
Hо если в system32 эти библиотеки уже есть, то копировать их и регестрировать не надо.
Потом нужно запустить proga.ехе, а после закрытия программы дерегестрировать скопированные библиотеки и удалить их из system32.
Как можна реализовать такую задачу пакетным файлом?
Зарание спасибо.

Petya V4sechkin
01-12-2009, 17:03
Toltec, пример для одной библиотеки:
@Echo Off
SetLocal EnableExtensions

If Not Exist %windir%\system32\1.dll (
Copy 1.dll %windir%\system32
Regsvr32 /s %windir%\system32\1.dll
)
Start /Wait proga.exe
If Exist %windir%\system32\1.dll (
Regsvr32 /u /s %windir%\system32\1.dll
Del /Q %windir%\system32\1.dll
)

Xaegr
01-12-2009, 17:41
Toltec, пример для одной библиотеки »
Библиотека будет удалена после выполнения даже если она и раньше присутствовала. А ведь она может быть необходима и для других приложений. Как я понял автор хочет удалить только те библиотеки которые были добавлены.

К сожалению не возьмусь писать это на batch, но на powershell будет так:
$sourcedir = "\\server\share"
$dlls = dir $sourcedir | select -expand name | where {-not (test-path "$env:windir\system32\$_")}
$dlls | foreach {cp "$sourcedir\$_" "$env:windir\system32\$_"; regsvr32 /s "$env:windir\system32\$_"}
proga.exe | out-null
$dlls | foreach {del "$env:windir\system32\$_"}

Toltec
01-12-2009, 18:06
Как я понял автор хочет удалить только те библиотеки которые были добавлены. »
Именно так и хочется, простите что не полностю прояснил задачу...
Xaegr, к сожалению с PowerShell не знаком, не знаю даже что это, но Спасибо за понимание и помощь...
Petya V4sechkin, Спасибо. Может можно сделать так, чтоб создался список скопированных библиотек, а потом по списку их дерегистрировать и удалить? Не знаю реально ли такое реализовать?

Petya V4sechkin
02-12-2009, 10:48
Toltec, простейший вариант:
@Echo Off
SetLocal EnableExtensions

Set Copied_1=
If Not Exist %windir%\system32\1.dll (
Copy 1.dll %windir%\system32
Regsvr32 /s %windir%\system32\1.dll
Set Copied_1=1
)
Start /Wait proga.exe
If Defined Copied_1 (
Regsvr32 /u /s %windir%\system32\1.dll
Del /Q %windir%\system32\1.dll
)

Toltec
02-12-2009, 11:01
Petya V4sechkin, спасибо большое! Только скажите пожалуйста куда в этом скрипте прописать другие библиотеки? Я так понял это пример для одной, а для нескольких нужно написать так ? :
@Echo Off
SetLocal EnableExtensions

Set Copied_1=
If Not Exist %windir%\system32\1.dll (
Copy 1.dll %windir%\system32
Regsvr32 /s %windir%\system32\1.dll
Set Copied_1=1
)
Set Copied_2=
If Not Exist %windir%\system32\2.dll (
Copy 2.dll %windir%\system32
Regsvr32 /s %windir%\system32\2.dll
Set Copied_2=2
)
Start /Wait proga.exe
If Defined Copied_1 (
Regsvr32 /u /s %windir%\system32\1.dll
Del /Q %windir%\system32\1.dll
)
If Defined Copied_2 (
Regsvr32 /u /s %windir%\system32\2.dll
Del /Q %windir%\system32\2.dll
)


Простите за настойчивость, но я только начинаю изучать пакетные файлы и многого не понимаю.... Спасибо.

Petya V4sechkin
02-12-2009, 11:04
Toltec, да, так нормально.

Toltec
02-12-2009, 11:13
Petya V4sechkin, Спасибо огромное за помощь!!!

Toltec
07-12-2009, 11:54
Здравствуйте, мне конечно не удобно еще раз переспрашивать и забирать ваше время, но последний скрипт у меня не работает...
Я сделал новый, на основе первого ответа от Petya V4sechkin, этот все делает как надо, только часть удаления хочется подправить, т.е. хочется, чтобы удалял только скопированные библиотеки...
Есть два вопроса: 1. Можно сделать так, чтобы в папке, рядом с пакетным файлом, создавался текстовый файл (1.тхт), со списком скопированных библиотек ? (Дальше я уже сам, сделаю удаление по этому списку...)

2. команда If Not Exist %windir%\system32\1.dll (
Copy 1.dll %windir%\system32
Regsvr32 /s %windir%\system32\1.dll означает: Если в папке %windir%\system32 нет библиотеки 1.dll, то скопировать 1.dll в %windir%\system32 и зарегестрировать 1.dll... а если библиотека 1.dll есть, то она все равно будет зарегистрирована или в даном случае условие (If Not Exist) отменяет и регистрацию библиотеки? Объясните мне пожалуйста, не понимаю как тут работает...

Зарание спасибо!




© OSzone.net 2001-2012