Я делаю объект pscustom, который выглядит так
PS C:\...\acc> $csv
Count NonExistentUser
----- ---------------
1sht 1sht
2sht 21sht
я конвертирую это
$csv = $csv | ConvertTo-Csv -NoTypeInformation
я загружаю это
$upload= Invoke-RestMethod -Headers $SessionHeader -Method Post -Uri $attachUri -Body $csv -ContentType 'multipart/form-data'
Загрузка работает, но csv на другом конце... весь csv находится в одной строке когда вы загружаете csv с любого другого портала, на котором хранятся вложения.
выходной csv, который всегда загружается, всегда находится в одной строке
"Count","NonExistentUser" "1sht","1sht" "2sht","21sht"
Как добавить разрывы ссылок в конец каждой строки перед отправкой или преобразованием?
хорошо, это относится почти ко всему, что находится в памяти PowerShell... вы используете модуль pnpsharepoint... вы используете метод invoke-rest... вам это понравится.
У вас есть csv, и вы не хотите записывать на диск ... потому что ... зачем кому-то когда-либо хотеть записывать на диск .... и вы проверяли, но ...
Теперь я знаю, что вы уже протестировали запись на диск и очень злитесь, что MS не предоставила -encoding utf8 для converto-csv
we never ever want to write to disk in code because who has a disk available
Export-Csv -Encoding utf8 -path <i in no way want to save to disk>
invoke-restmethod -infile $csv
or
$stream = [IO.MemoryStream]::new([Text.Encoding]::ASCII.GetBytes($CSV))
$attachmentInfo = New-Object -TypeName Microsoft.SharePoint.Client.AttachmentCreationInformation
$attachmentInfo.FileName = $fileName
$attachmentInfo.ContentStream = $stream
$attchedFile = $listItem.AttachmentFiles.Add($attachmentInfo)
да, он продолжает удалять ваш символ конца строки .. вот, пожалуйста
$csv = @()
$csv += [pscustomobject]@{
Count = '1sht'
NonExistentUser = '1sht'
}
$csv += [pscustomobject]@{
Count = '2sht'
NonExistentUser = '21sht'
}
теперь конвертируйте это, прежде чем использовать его
$csv = $csv | convertto-csv -NoTypeInformation | out-string
$csv = $csv -replace "`r`n","`n"
Теперь используйте эту новую переменную $csv... ура!
Если вы используете PowerShell Core, почти все по умолчанию использует UTF8 без спецификации.
ConvertTo-Csv
выводит строки, а строки PowerShells всегда являются строками .NET (внутри состоят из кодовых единиц Unicode UTF-16). Использование другой кодировки символов применимо только при общении с внешним миром. Поэтому параметр -Encoding
не подходит для ConvertTo-Csv
, но он подходит для командлетов, которые записывают в файл, таких как Export-Csv
, например.
Чтобы управлять кодировкой строк для включения в запросы, отправляемые Invoke-RestMethod
, добавьте что-то вроде ;charset=utf-8
к параметру -ContentType
; например -ContentType 'application/json;charset=utf-8'
тл; др:
# $csv is an array of *custom objects*.
# If you send those to ConvertTo-Csv, you'll get an *array* of lines,
# which you must explicitly join to form a *single, multiline string*
# in order to pass it to -Body below.
$csvData = ($csv | ConvertTo-Csv -NoTypeInformation) -join "`n"
Invoke-RestMethod -Headers $SessionHeader -Method Post -Body $csvData -ContentType 'multipart/form-data' -Uri $attachUri
Примечание:
По умолчанию Invoke-RestMethod использует кодировку символов ISO-8859-1 (почти идентичную Windows-1252, с отсутствием нескольких символов) для кодирования строк в запросах.
Чтобы вместо этого использовать UTF-8, добавьте ;charset=utf-8
к аргументу -ContentType
(например, -ContentType 'application/json;charset=utf-8'
.
Похоже, ваша единственная проблема заключалась в том, что ваше (окончательное) значение $csv
, которое представляет собой массив строк, потому что это то, что испускает ConvertTo-Csv, было передано -Body
как есть, что заставило Invoke-RestMethod
неявно преобразовать массив в строки.
Когда PowerShell автоматически преобразует массив в строки, его элементы объединяются пробелами, что приводит к однострочному представлению.
Простой пример с использованием расширяемой строки ("..."
), которая применяет ту же самую строку:
PS> $lines = 'one', 'two'; "$($lines)"
one two
Следовательно, чтобы передать ваши данные CSV в виде многострочной строки, как и предполагалось, вы должны сначала явно соединить элементы массива с символами новой строки, как показано выше, с помощью -join
, оператора соединения строк
обновлено для чтения