2016-05-09 14 views
0

私は検索しましたが、何の答えも見つかりませんでした。
タスクは、powershell ps1を使用して1つのDLLを登録し、その後に他のスクリプト行を続けます。私はダイアログで中断したくないので、/sパラメータを追加しました。しかし、成功しても失敗しても結果情報は無視されます。 結果をコンソールに表示します。しかしどうですか? Start-Process -PassThruPowershellがダイアログの代わりにコンソールにRegsvr32結果を表示する

答えて

1

起動regsvr32.exe /sExitCodeプロパティを調べる:ここ

$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 

が:)

関連する問題