【问题标题】:Powershell to display Regsvr32 result in console instead of dialogPowershell 在控制台而不是对话框中显示 Regsvr32 结果
【发布时间】:2016-05-09 08:03:27
【问题描述】:

我已搜索但未找到任何答案。
任务是使用 Powershell ps1 注册一个 dll,然后是其他行脚本。我不想被对话框打断,所以添加了/s 参数。但是现在无论成功还是失败,结果信息都被忽略了。 我希望结果显示在控制台中。但是怎么做呢?

【问题讨论】:

    标签: powershell regsvr32


    【解决方案1】:

    使用Start-Process -PassThru 启动regsvr32.exe /s 并检查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)"
    }
    

    【讨论】:

    • 谢谢,我试过了,但错误代码似乎不同,在对话框中是 0x80070005,在控制台中是 5。为什么?
    • 0x800700055 相同的错误代码 (ACCESS_DENIED)
    【解决方案2】:

    这是一个更完整的带有管道支持的完整的 powershell cmdlet。

    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 
    

    享受:)

    【讨论】:

      【解决方案3】:

      谢谢贾斯汀!我正在使用这个脚本,效果很好。

      下面这行代码好像有错别字:

      $regsvrp = Start-Process regsvr32.exe -ArgumentList "/s $regflag <code>$p</code>" -Wait -NoNewWindow -PassThru
      

      代码标签不应该在那里。我将其更改为以下内容,并在路径周围添加了转义双引号以支持路径中的空格:

      $regsvrp = Start-Process regsvr32.exe -ArgumentList "/s $regflag `"$p`"" -Wait -NoNewWindow -PassThru 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多