Import-DbaCsv工具中的-Encoding参数有哪些选项?

时间:2019-05-28 16:03:22

标签: powershell dbatools

我无法弄清楚 Import-DbaCsv 工具对 -Encoding 参数的期望。

文档没有帮助-https://docs.dbatools.io/#Import-DbaCsv

我尝试使用大写,小写,带引号和不带引号的UTF-8,UTF8和UTF。

我总是收到这样的错误消息:

  

无法将类型为“ System.String”的“ UTF-8”值转换为类型为“ System.Text.Encoding”

3 个答案:

答案 0 :(得分:1)

您提供给我们的链接显示-Encoding参数的类型为<Encoding>,这使我相信您需要使用任何[System.Text.Encoding]编码类而不是字符串:< / p>

enter image description here

因此,在您的情况下,请使用[System.Text.Encoding]::UTF8

答案 1 :(得分:1)

期望的类型为System.Text.Encoding,但此处没有适用的内置字符串到编码的转换。

您可以通过应用PSTypeConverter来解决此问题:

using namespace System.Management.Automation
using namespace System.Text

class PSTextEncodingConverter : PSTypeConverter {
    hidden
    [hashtable]
    $ConversionTable = @{
        'ASCII'               = [System.Text.Encoding]::ASCII
        'ANSI'                = [System.Text.Encoding]::ASCII

        'UTF7'                = [System.Text.Encoding]::UTF7
        'UTF-7'               = [System.Text.Encoding]::UTF7

        'UTF8'                = [System.Text.Encoding]::UTF8
        'UTF-8'               = [System.Text.Encoding]::UTF8

        'Unicode'             = [System.Text.Encoding]::Unicode
        'UTF16LE'             = [System.Text.Encoding]::Unicode
        'LittleEndianUnicode' = [System.Text.Encoding]::Unicode

        'UTF16BE'             = [System.Text.Encoding]::BigEndianUnicode
        'BigEndianUnicode'    = [System.Text.Encoding]::BigEndianUnicode

        'UTF32'               = [System.Text.Encoding]::UTF32
        'UTF-32'              = [System.Text.Encoding]::UTF32

        'Default'             = [System.Text.Encoding]::Default        
    }

    [bool]
    CanConvertFrom([object]$value, [type]$targetType) {
        return (
            $this.IsEncodingType($targetType)
        ) -and (
            (
                $value -is $targetType
            ) -or (
                (
                    $value -is [string] 
                ) -and (
                    "$value" -in $this.ConversionTable.Keys
                )
            )
        )
    }

    [object]
    ConvertFrom([object]$value, [Type]$targetType, [IFormatProvider]$format, [bool]$ignoreCase) {
        if ($value -is $targetType) {
            return $value
        }

        if ($this.ConversionTable.Contains("$value")) {
            return $this.ConversionTable["$value"]
        }

        throw "Failed to convert '$value' to [$($targetType.FullName)]."
    }

    [bool]
    CanConvertTo([object]$value, [Type]$targetType) {
        return $this.CanConvertFrom($value, $targetType)
    }

    [object]
    ConvertTo([object]$value, [Type]$targetType, [IFormatProvider]$format, [bool]$ignoreCase) {
        return $this.ConvertFrom($value, $targetType, $format, $ignoreCase)
    }

    [bool]
    IsEncodingType([type]$targetType) {
        $type = $targetType
        do {
            if ($type -eq [Encoding]) {
                return $true
            }
        } while (($type = $type.BaseType) -ne $null)

        return $false
    }
}

然后向Update-TypeData注册类型转换器:

Update-TypeData -TypeName System.Text.Encoding -TypeConverter PSTextEncodingConverter

现在,任何需要[Encoding]实例的参数都将在其位置接受字符串值UTF-8UTF8

Import-DbaCsv -Path .\file.csv -SqlInstance sqlsrv -Database db1 -Encoding UTF8

答案 2 :(得分:0)

对不起,那是我的坏事。我已经大量更新了Import-DbaCsv,这将在20天后发布dbatools 1.0时得到解决。除了能够传递纯文本编码外,Encoding在发布时也会自动完成并实际上能正常工作。如果您想早点使用它,请查看GitHub中的prerelease分支。