Какие есть параметры для параметра -Encoding в инструменте Import-DbaCsv?
Я не могу понять, что ожидает инструмент Import-DbaCsv для параметра -Encoding.
Документы не помогают - https://docs.dbatools.io/
Я пробовал UTF-8, UTF8 и UTF в верхнем регистре, нижнем регистре, с кавычками и без кавычек.
Я всегда получаю и сообщение об ошибке, как это:
Не удалось преобразовать значение "UTF-8" типа "System.String" в тип "System.Text.Encoding"
3 ответа
Ссылка, которую вы нам дали, показывает -Encoding
параметр имеет тип <Encoding>
, что наводит меня на мысль, что вам нужно использовать любой из [System.Text.Encoding]
классы кодирования вместо строки:
https://i.stack.imgur.com/2uySf.png
Итак, в вашем случае используйте [System.Text.Encoding]::UTF8
Ожидаемый тип 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-8
или же UTF8
на его месте:
Import-DbaCsv -Path .\file.csv -SqlInstance sqlsrv -Database db1 -Encoding UTF8
Извини, это было плохо. Я обновил Import-DbaCsv за тонну, и это будет решено, когда dbatools 1.0 выйдет через 20 дней. В дополнение к возможности передавать кодировку в виде обычного текста, Encoding будет автоматически завершаться и фактически работать, когда мы выпускаем. Если вы хотите раньше, посмотрите наш prerelease
филиал в GitHub.