Формат Powershell-таблица по-прежнему отображается в виде списка, не удается получить ее в табличной форме

#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 / …