安全使用Update-FormatData?

时间:2012-11-28 10:51:07

标签: powershell

在自定义PowerShell模块中,我在模块定义的顶部有这段代码:

Update-FormatData -AppendPath (Join-Path $psscriptroot "*.ps1xml")

在加载所有.ps1xml文件时,此工作正常。

但是,有时使用Import-Module MyModule -Force加载模块(实际上,这是在模块的安装脚本中)。

在这种情况下,对Update-FormatData的调用因此错误而失败:

Update-FormatData : There were errors in loading the format data file:
Microsoft.PowerShell, c:\pathto\myfile.Types.ext.ps1xml : File skipped because it was already present from "Microsoft.PowerShell".
At line:1 char:18
+ Update-FormatData <<<<  -AppendPath "c:\pathto\myfile.Types.ext.ps1xml"
    + CategoryInfo          : InvalidOperation: (:) [Update-FormatData], RuntimeException
    + FullyQualifiedErrorId : FormatXmlUpateException,Microsoft.PowerShell.Commands.UpdateFormatDataCommand

有没有办法安全地调用此命令?

我知道我可以在没有参数的情况下调用Update-FormatData,它会更新任何已知的.ps1xml文件,但只有在文件已经加载的情况下才会有效。

我可以在某处列出加载的格式数据文件吗?

以下是一些背景知识:

我正在构建使用脚本安装的自定义模块。安装脚本如下所示:

[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact="High")]
param()
process {
    $target = Join-Path $PSHOME "Modules\MyModule"
    if ($pscmdlet.ShouldProcess("$target","Deploying MyModule module"))
    {
        if(!(Test-Path $target)) { new-Item -ItemType Directory -Path $target | Out-Null }
        get-ChildItem -Path (Split-Path ((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path) | copy-Item -Destination $target -Force

        Write-Host -ForegroundColorWhite @"

The module has been installed. You can import it using :

    Import-Module MyModule

Or you can add it in your profile ($profile)
"@

        Write-Warning "To refresh any open PowerShell session, you should run ""Import-Module MyModule -Force"" to reload the module"

        Import-Module MyModule -Force

        Write-Warning "This session has been refreshed."
    }
}

MyModule定义了第一行语句:

Update-FormatData -AppendPath (Join-Path $psscriptroot "*.ps1xml")

当我更新$profile以始终加载此模块时,在运行安装脚本时调用了Update-Path命令。在安装脚本中,我强制导入模块,再次触发模块,然后Update-Path调用

1 个答案:

答案 0 :(得分:1)

一种简单的方法是使用-erroraction(别名-ea)参数:

Update-FormatData -AppendPath (Join-Path $psscriptroot "*.ps1xml") -force -ea SilentlyContinue

不会显示错误。