Безопасно ли вызывать Regsvr32 одновременно?

1550
Scott Chamberlain

У меня есть около 100 библиотек DLL, с которыми мне нужно зарегистрироваться regsvr32 /s some.dll, нужно ли мне ждать regsvr32окончания каждого звонка, прежде чем я сделаю следующий звонок, или я могу просто запустить их все одновременно.

В основном у меня есть скрипт Powershell

if([System.Environment]::Is64BitOperatingSystem) { $regsvr = [System.Environment]::ExpandEnvironmentVariables('%windir%\SysWOW64\regsvr32.exe') } else { $regsvr = [System.Environment]::ExpandEnvironmentVariables('%windir%\System32\regsvr32.exe') }  foreach( $file in $filesToRegister) {  Write-Verbose "$regsvr /s ""$file""" Start-Process $regsvr -ArgumentList '/s', """$file""" -Wait } 

Все файлы, которые регистрируются, являются файлами vb6 dll, которые генерируются большим проектом. Мне нужно, чтобы иметь ли -Waitна моем Start-Processили это безопасно принимать его?

3
Было бы довольно забавно, если бы в процессе не принимались необходимые меры безопасности автоматически. : D При этом, вы, вероятно, хотите, чтобы какой-то отчет об успехе / неудаче. Daniel B 7 лет назад 0
@DanielB, это действительно мой вопрос, или он не принимает эти меры безопасности автоматически? Scott Chamberlain 7 лет назад 0
Я думаю, что нет, регистрация не будет поточно-ориентированной. просто догадка, он может правильно синхронизировать ресурс, в котором он зарегистрирован (реестр, который я представляю), но я бы не стал на это ставить. Frank Thomas 7 лет назад 0
Я зарегистрировал 10 или 15 DLL одновременно, используя CMD (пакетный) файл без проблем. Чтобы получить отчет об ошибках, в конце была PAUSE, поэтому я мог прочитать проблемы (например, некоторые DLL не имели точки входа для регистрации, что было несущественным). DrMoishe Pippik 7 лет назад 0

1 ответ на вопрос

2
Scott Chamberlain

Поэкспериментировав немного, я обнаружил, что regsvr32позволяет передавать более одного файла за раз. Переключение $filesToRegisterна использование относительных путей, чтобы уменьшить общую длину списка аргументов, и теперь я делаю

if([System.Environment]::Is64BitOperatingSystem) { $regsvr = [System.Environment]::ExpandEnvironmentVariables('%windir%\SysWOW64\regsvr32.exe') } else { $regsvr = [System.Environment]::ExpandEnvironmentVariables('%windir%\System32\regsvr32.exe') }  Set-Location $currentBuildFolder $arguments = @('/s') + $filesToRegister Write-Verbose "$regsvr $arguments" Start-Process $regsvr -ArgumentList $arguments -Wait 

И это завершается намного быстрее.

Вы уверены, что regsvr32 работает с несколькими файлами за один раз? Я не вижу никаких ссылок, кроме "dllname" в Technet: https://technet.microsoft.com/en-us/library/bb490985.aspx [для XP, но синтаксис, кажется, не изменился], и https://support.microsoft.com/en-us/help/249873/how-to-use-the-regsvr32-tool-and-troubleshoot-regsvr32-error-messages CJBS 6 лет назад 0
Да, я уверен, удалите `/ s`, и вы получите диалоговое окно для каждого файла, который вы передали. Scott Chamberlain 6 лет назад 0