Проблема с концом строки PowerShell ConvertTo-CSV при отправке в другие элементы

Я делаю объект 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"

Как добавить разрывы ссылок в конец каждой строки перед отправкой или преобразованием?

обновлено для чтения

William Lee 18.12.2020 21:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
1
531
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

хорошо, это относится почти ко всему, что находится в памяти 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 без спецификации.

AdminOfThings 18.12.2020 19:58
ConvertTo-Csv выводит строки, а строки PowerShells всегда являются строками .NET (внутри состоят из кодовых единиц Unicode UTF-16). Использование другой кодировки символов применимо только при общении с внешним миром. Поэтому параметр -Encoding не подходит для ConvertTo-Csv, но он подходит для командлетов, которые записывают в файл, таких как Export-Csv, например.
mklement0 18.12.2020 20:41

Чтобы управлять кодировкой строк для включения в запросы, отправляемые Invoke-RestMethod, добавьте что-то вроде ;charset=utf-8 к параметру -ContentType; например -ContentType 'application/json;charset=utf-8'

mklement0 18.12.2020 21:26
Ответ принят как подходящий

тл; др:

# $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

Примечание:


Похоже, ваша единственная проблема заключалась в том, что ваше (окончательное) значение $csv, которое представляет собой массив строк, потому что это то, что испускает ConvertTo-Csv, было передано -Body как есть, что заставило Invoke-RestMethod неявно преобразовать массив в строки.

Когда PowerShell автоматически преобразует массив в строки, его элементы объединяются пробелами, что приводит к однострочному представлению.

Простой пример с использованием расширяемой строки ("..."), которая применяет ту же самую строку:

PS> $lines = 'one', 'two'; "$($lines)"
one two

Следовательно, чтобы передать ваши данные CSV в виде многострочной строки, как и предполагалось, вы должны сначала явно соединить элементы массива с символами новой строки, как показано выше, с помощью -join, оператора соединения строк

Другие вопросы по теме