2016-05-09 4 views
0

Я искал, но не нашел ответа.
Задача регистрации одной dll с использованием Powershell ps1, за которой следуют другие строки скриптов. Я не хочу прерывать диалог, поэтому добавил параметр /s. Но теперь информация о результатах игнорируется, независимо от успеха или неудачи. Я хочу, чтобы результат отображался в консоли. Но как?Powershell для отображения Regsvr32 приводит к консоли вместо диалога

ответ

1

regsvr32.exe /s Запуск с Start-Process -PassThru и осмотрите ExitCode свойство:

$regsvrp = Start-Process regsvr32.exe -ArgumentList "/s C:\path\to\your.dll" -PassThru 
$regsvrp.WaitForExit(5000) # Wait (up to) 5 seconds 
if($regsvrp.ExitCode -ne 0) 
{ 
    Write-Warning "regsvr32 exited with error $($regsvrp.ExitCode)" 
} 
+0

Спасибо, я пытался, но код ошибки выглядит иначе, в диалоге это 0x80070005, в консоли, это 5. Почему? –

+0

'0x80070005' и' 5' * * - тот же код ошибки ('ACCESS_DENIED') –

1

Вот более полный полный PowerShell Командлет с поддержкой трубопровода.

function Register-Dll 
{ 
    <# 
    .SYNOPSIS 
     A function that uses the utility regsvr32.exe utility to register a file 
    .PARAMETER Path 
     The file path 
    .PARAMETER Unregister 
     when specified, unregisters instead of registers 
    #> 
    [CmdletBinding()] 
    param (
     [ValidateScript({ Test-Path -Path $_ -PathType 'Leaf' })]  
     [Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipeLineByPropertyName=$true)] 
     [Alias("FullName")] 
     [string[]]$Path, 
     [Alias("u")] 
     [switch]$Unregister 
     ) 
    begin { 
     if ($Unregister) 
     { 
      $regflag = "-u " 
     } 
     else 
     { 
      $regflag = "" 
     } 
     [int]$NumFailed=0 
     $RegExitCodes = @{ 
      0="SUCCESS"; 
      1="FAIL_ARGS - Invalid Argument"; 
      2="FAIL_OLE - OleInitialize Failed"; 
      3="FAIL_LOAD - LoadLibrary Failed"; 
      4="FAIL_ENTRY - GetProcAddress failed"; 
      5="FAIL_REG - DllRegisterServer or DllUnregisterServer failed."; 
     } 
    } 
    process { 
     foreach ($p in $path) 
     { 
      try 
      { 
       $regsvrp = Start-Process regsvr32.exe -ArgumentList "/s $regflag <code>$p</code>" -Wait -NoNewWindow -PassThru 

       if($regsvrp.ExitCode -ne 0) 
       { 
        $NumFailed++ 
        Write-Error "regsvr32 $regflag for $p exited with error $($regsvrp.ExitCode) - $($RegExitCodes[$regsvrp.ExitCode])" 
       } 
      } catch { 
       $NumFailed++ 
       Write-Error $_.Exception.Message 
      } 
     } 
    } 
    end { 
     if ($NumFailed -gt 0) 
     { 
      if ($Unregister) 
      { 
       $mode = "unregister" 
      } 
      else 
      { 
       $mode = "register" 
      } 
      Write-Error "Failed to $mode $NumFailed dll's, see previous errors for detail" 
     } 
    } 
} 

Использование:

function Register-MyAppDll 
{ 

    param(
     [Parameter(Mandatory=$true,ParameterSetName="Both")] 
     [switch]$ReRegister, 
     [Parameter(Mandatory=$true,ParameterSetName="UnregisterOnly")] 
     [Alias("u")] 
     [switch]$UnRegister, 
     [Parameter(Mandatory=$true,ParameterSetName="RegisterOnly")] 
     [Alias("r")] 
     [switch]$Register 
    ) 


    $RegOptions = @() 
    if ($UnRegister -or $ReRegister) { $RegOptions += @{Unregister=$true} } 
    if ($Register -or $ReRegister) { $RegOptions += @{} } 

    $dlltoregister = Get-ChildItem "C:\MyApp\bin" -Filter *.dll | where {$_ -notmatch '^interop'} 

    foreach ($RegOpt in $RegOptions) 
    { 
     $dlltoregister | Register-Dll @RegOpt 
    } 

} 


Register-MyAppDll -UnRegister 
Register-MyAppDll -Register 
Register-MyAppDll -ReRegister 

Наслаждайтесь :)