gpt4 book ai didi

powershell - TypeConverter(注册)在PowerShell中抛出NullRefException

转载 作者:行者123 更新时间:2023-12-03 00:06:45 24 4
gpt4 key购买 nike

我有一个 PowerShell 类,我想自动从 string 转换它。

所以我这样定义了一个TypeConverter:

    class StringToAcmeStateConverter : System.Management.Automation.PSTypeConverter {
[bool] CanConvertFrom([object] $object, [Type] $destinationType) {
if($object -is [string]) {
return Test-Path ([string]$object);
}

return $false;
}

[bool] CanConvertTo([object] $object, [Type] $destinationType) {
return $false
}

[object] ConvertFrom([object] $sourceValue, [Type] $destinationType,
[IFormatProvider] $formatProvider, [bool] $ignoreCase)
{
if($null -eq $sourceValue) { return $null; }

if(-not $this.CanConvertFrom($sourceValue, $destinationType)) {
throw [System.InvalidCastException]::new();
}

$paths = [AcmeStatePaths]::new($sourceValue);
return [AcmeDiskPersistedState]::new($paths, $false, $true);
}

[object] ConvertTo([object] $sourceValue, [Type] $destinationType,
[IFormatProvider] $formatProvider, [bool] $ignoreCase)
{
throw [System.NotImplementedException]::new();
}
}

[System.ComponentModel.TypeConverter([StringToAcmeStateConverter])]
<# abstract #> class AcmeState {
AcmeState() {
if ($this.GetType() -eq [AcmeState]) {
throw [System.InvalidOperationException]::new("This is intended to be abstract - inherit To it.");
}
}

<# omitted #>
}

(此处列出完整代码:https://raw.githubusercontent.com/PKISharp/ACMESharpCore-PowerShell/deep-state/ACME-PS/internal/classes/AcmeState.ps1)

但是 PowerShell 现在会从管道内部抛出 NullRefException。如何让 PS 正确使用 Converter。

更新

由于这个问题没有包含完整重现的足够信息,我创建了一个包含模块当前(失败)代码的要点:gist.github.com/glatzert/ba32f291b9155e6d19c29fbe9594a7c5

最佳答案

使用 PowerShell 类的 TypeConversion 有一些不明显的问题。

我使用 TypeConverter-Attribute 的第一种方法因 NullRefException 或 UnknownTypeException 而失败(这取决于 *.ps1 中类的顺序)。

我深入研究了 Types.ps1xml 并创建了以下 xml:

<Types>
<Type>
<Name>AcmeState</Name>
<TypeConverter>
<TypeName>StringToAcmeStateConverter</TypeName>
</TypeConverter>
</Type>
</Types>

并将 TypesToProcess 添加到指向上述 ps1xml 的 .psd1。
这将失败,说明转换器未知,这可能意味着 PowerShell 将在另一个上下文中作为模块或在加载模块之前处理该文件。

为了解决这个问题,我从 .psd1 中删除了 TypesToProcess 并添加了 Update-TypeData Types.ps1xml 作为我模块的最后一行,因此它将运行在模块导入期间自动 - 瞧!这行得通。

TLDR:如果要注册在 PowerShell 类中定义的 TypeConverter,则需要使用 Update-TypeData

关于powershell - TypeConverter(注册)在PowerShell中抛出NullRefException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59678198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com