#powershell
#powershell
Вопрос:
У меня есть скрипт для получения элементов из списка, записи значений для каждого элемента, и все, что я хочу сделать, это перенести это в таблицу. Я пробовал Format-Table, Format-Table — Force, Select-Object затем Format-Table, и это не работает, результаты просто отображаются в списке, несмотря ни на что.
#CAML Query to Filter List Items
$Query = "<View><Query><Where><Eq><FieldRef Name='MyChoice' /><Value Type='Choice'>Text Two</Value>
</Eq></Where></Query></View>"
#Get All List Items matching given query
$ListItems = Get-PnPListItem -List $ListName -Query $Query
#Loop through each Item
Write-host -f Green "Number of List Items Found:"$ListItems.Count
$output =
ForEach($ListItem in $ListItems)
{
Write-Output "Id :" $ListItem["ID"]
Write-Output "FileLeafRef :" $ListItem["FileLeafRef"]
Write-Output "MySecurity :" $ListItem["MySecurity"]
}
$Output | Format-Table -Property ID, FileLeafRef, MySecurity | Out-File
"C:whereverFile4.csv"
Как это отображается сейчас, когда я запускаю этот скрипт (пример из 2 элементов списка):
Идентификатор: 1 FileLeafRef: MyFile.docx MySecurity: Внутренний идентификатор: 2 FileLeafRef: MySecondFile.png MySecurity: Закрытый
Я действительно не могу добавить сюда таблицу, даже с помощью Html… но, по сути, я просто хочу, чтобы каждый элемент списка был строкой, и я хочу столбцы: ИДЕНТИФИКАТОР, FileLeafRef, MySecurity вверху.
Комментарии:
1. Можете ли вы добавить краткий пример выходных данных, которые генерирует ваш код в данный момент, и как бы вы хотели, чтобы это выглядело вместо этого?
2. @mclayton — сделал все возможное, чтобы добавить немного примера в исходный вопрос. Спасибо
Ответ №1:
Во-первых, PowerShell по умолчанию использует табличный вид для результатов из 4 столбцов и ниже. Вы запрашиваете только 3. Таким образом, эта таблица формата вообще не нужна. Кроме того, Out-File не генерирует формат Csv. Это обычный текст.
Это…
#Loop through each Item
Write-host -f Green "Number of List Items Found:"$ListItems.Count
$output =
ForEach($ListItem in $ListItems)
{
Write-Output "Id :" $ListItem["ID"]
Write-Output "FileLeafRef :" $ListItem["FileLeafRef"]
Write-Output "MySecurity :" $ListItem["MySecurity"]
}
$Output | Format-Table -Property ID, FileLeafRef, MySecurity | Out-File
"C:whereverFile4.csv"
… это неправильный подход для получения ваших конечных результатов. Вы бы никогда не использовали Format-Table для создания файла таким образом. Таблица формата предназначена для вывода на экран.
Итак, попробуйте это…
#Loop through each Item
Write-host -f Green "Number of List Items Found:"$ListItems.Count
ForEach($ListItem in $ListItems)
{
[PSCustomObject]@{
Id = "$ListItem['ID']"
FileLeafRef = "$ListItem[FileLeafRef]"
MySecurity = "$ListItem['MySecurity']"
} |
Export-Csv -Path 'C:whereverFile4.csv' -Append -NoTypeInformation
}
Пример с результатами:
#Loop through each Item
Write-host -f Green "Number of List Items Found:"$(Get-Process).Count
ForEach($ListItem in (Get-Process))
{
[PSCustomObject]@{
Id = $ListItem.Id
FileLeafRef = $ListItem.Handles
MySecurity = $ListItem.ProcessName
} |
Export-Csv -Path 'D:tempFile4.csv' -Append -NoTypeInformation
}
Import-Csv -Path 'D:tempFile4.csv'
# Results
<#
Id FileLeafRef MySecurity
-- ----------- ----------
7236 204 aesm_service
2144 476 ApplicationFrameHost
21000 150 AppVShNotify
...
#>
Тем не менее, если вы говорите, что хотите форматированный / табличный текстовый файл в качестве отчета, тогда это…
#Loop through each Item
Write-host -f Green "Number of List Items Found:"$(Get-Process).Count
$ListReport = ForEach($ListItem in (Get-Process))
{
[PSCustomObject]@{
Id = $ListItem.Id
FileLeafRef = $ListItem.Handles
MySecurity = $ListItem.ProcessName
}
}
Out-File -FilePath 'D:tempFile4.txt' -InputObject $ListReport
Get-Content -Path 'D:tempFile4.txt'
# Results
<#
Id FileLeafRef MySecurity
-- ----------- ----------
7236 204 aesm_service
2144 476 ApplicationFrameHost
21000 150 AppVShNotify
...
#>
Комментарии:
1. Спасибо за это, извините, я должен был упомянуть, что я попробовал Export-csv, который также выдал мне список. Ваше первое предложение наконец сработало!
2. Не беспокойтесь. Спасибо за помощь. Просто помните, Write-* на самом деле просто отправляет выходные данные на экран. Формат — * та же сделка. Вывод в файл, csv, txt, html, xml, json и др. Всегда касается объекта / свойств. Обратите внимание, вы можете отправить текст в формате экрана в файл, используя несколько подходов, но в вашем случае это не обязательно.
Ответ №2:
Я не уверен, что вы пытаетесь сделать с
$output = ForEach($ListItem in $ListItems)
{
Write-Output "Id :" $ListItem["ID"]
Write-Output "MyRetention :" $ListItem["MyRetention"]
Write-Output "FileLeafRef :" $ListItem["FileLeafRef"]
Write-Output "MySecurity :" $ListItem["MySecurity"]
}
Избавьтесь от этого, вы перезаписываете этим свой хороший список объектов.
Выводите объекты напрямую (используйте Export-Csv
для вывода CSV, а не Out-File
):
$ListItems | Export-Csv "C:whereverFile4.csv" -Delimiter ";" -NoTypeInformation
Вы можете использовать Select-Object
, чтобы свести их к определенным полям:
$Output = $ListItems | Select-Object ID, MyRetention, FileLeafRef, MySecurity
$Output | Export-Csv "C:whereverFile4.csv" -Delimiter ";" -NoTypeInformation
Конечно, вы могли бы написать отдельный Get-PnPListItem | Select-Object | Export-Csv
конвейер, но иногда его легче читать, если вы используете промежуточные переменные и разбиваете его на несколько строк.
Комментарии:
1. Я по-прежнему получаю список только с обоими вашими командлетами. Заменив раздел вывода и используя ваше первое предложение по коду, я получаю один столбец, полный странных значений, таких как «Microsoft. SharePoint. Клиент. AttachmentCollection»;;;;»Microsoft. SharePoint. Клиент. ContentType»;;»Microsoft. SharePoint. Клиент. DlpPolicyTip»;;;» и ни одно из полей, которые мне действительно нужны. Если я использую 2-й командлет, я также получаю список — не таблицу, а только идентификатор и «;;;»
2. Также у меня есть triev, использующий вместо ссылки CAML <ViewFields>, и это не отображает поля. У меня есть отдельный вопрос по этому поводу: sharepoint.stackexchange.com/questions/284013 / …