Import-DbaCsv 工具中的 -Encoding 参数有哪些选项?
What are the options for the -Encoding parameter in the Import-DbaCsv tool?
我无法弄清楚 Import-DbaCsv 工具对 -Encoding 参数的期望值。
文档没有帮助 - https://docs.dbatools.io/#Import-DbaCsv
我试过 UTF-8、UTF8 和大写、小写、带引号和不带引号的 UTF。
我总是收到这样的错误消息:
Cannot convert the "UTF-8" value of type "System.String" to type "System.Text.Encoding"
你给我们的 link 显示 -Encoding
参数是 <Encoding>
类型,这让我相信你需要使用任何 [System.Text.Encoding]
编码 类 而不是字符串:
所以在你的情况下,使用 [System.Text.Encoding]::UTF8
预期类型是 System.Text.Encoding
,但没有 built-in string-to-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-8
或 UTF8
:
Import-DbaCsv -Path .\file.csv -SqlInstance sqlsrv -Database db1 -Encoding UTF8
对不起,那是我的错。我已经更新了 Import-DbaCsv 一吨,这将在 20 天后 dbatools 1.0 发布时得到解决。除了能够通过 plain-text 编码之外,Encoding 将自动完成并且 实际工作 当我们发布时。如果您希望早点使用,请查看我们在 GitHub 中的 prerelease
分支。
我无法弄清楚 Import-DbaCsv 工具对 -Encoding 参数的期望值。
文档没有帮助 - https://docs.dbatools.io/#Import-DbaCsv
我试过 UTF-8、UTF8 和大写、小写、带引号和不带引号的 UTF。
我总是收到这样的错误消息:
Cannot convert the "UTF-8" value of type "System.String" to type "System.Text.Encoding"
你给我们的 link 显示 -Encoding
参数是 <Encoding>
类型,这让我相信你需要使用任何 [System.Text.Encoding]
编码 类 而不是字符串:
所以在你的情况下,使用 [System.Text.Encoding]::UTF8
预期类型是 System.Text.Encoding
,但没有 built-in string-to-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-8
或 UTF8
:
Import-DbaCsv -Path .\file.csv -SqlInstance sqlsrv -Database db1 -Encoding UTF8
对不起,那是我的错。我已经更新了 Import-DbaCsv 一吨,这将在 20 天后 dbatools 1.0 发布时得到解决。除了能够通过 plain-text 编码之外,Encoding 将自动完成并且 实际工作 当我们发布时。如果您希望早点使用,请查看我们在 GitHub 中的 prerelease
分支。