2016-05-09 11 views
0

Ich habe gesucht, aber keine Antwort gefunden.
Die Aufgabe ist Register 1 DLL Powershell PS1, gefolgt von anderen Zeilen von Skripten. Ich möchte nicht durch den Dialog unterbrochen werden, also fügte ich den Parameter hinzu. Aber jetzt wird die Ergebnisinformation ignoriert, egal ob erfolgreich oder fehlgeschlagen. Ich möchte das Ergebnis in der Konsole angezeigt werden. Aber wie?Powershell zum anzeigen Regsvr32 Ergebnis in der Konsole anstelle von Dialog

Antwort

1

Starten regsvr32.exe /s mit Start-Process -PassThru und überprüfen Sie die ExitCode Eigenschaft:

$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

Danke, habe ich versucht, aber der Code Fehler scheint anders, in Dialog ist es 0x80070005, in der Konsole, ist es 5. Warum? –

+0

'0x80070005' und' 5' * sind * derselbe Fehlercode ('ACCESS_DENIED') –

1

hier ein vollständigeres volle Powershell-Cmdlets mit Pipeline-Unterstützung ist.

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" 
     } 
    } 
} 

Verbrauch:

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 

Enjoy :)

Verwandte Themen