Skip to content

Commit 4048290

Browse files
gautamdshethGautam Sheth
andauthored
Feature #3861: adding capability to return a folder as list item (#4151)
* Fixes #3861: added as ListItem return type for folder objects if fetching by specific folders * Fixed code to retrieve folder as listitem --------- Co-authored-by: Gautam Sheth <gautam.sheth@staffbase.com>
1 parent ef5feea commit 4048290

File tree

2 files changed

+104
-65
lines changed

2 files changed

+104
-65
lines changed

documentation/Get-PnPFolder.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ Get-PnPFolder -CurrentWebRootFolder [-Includes <String[]>] [-Connection <PnPConn
2626

2727
### Folder by url
2828
```powershell
29-
Get-PnPFolder -Url <String> [-Includes <String[]>] [-Connection <PnPConnection>] [-Verbose]
29+
Get-PnPFolder -Url <String> [-Includes <String[]>] [-AsListItem <SwitchParameter>] [-Connection <PnPConnection>] [-Verbose]
3030
```
3131

3232
### Root folder of a list
3333
```powershell
34-
Get-PnPFolder -ListRootFolder <ListPipeBind> [-Includes <String[]>] [-Connection <PnPConnection>] [-Verbose]
34+
Get-PnPFolder -ListRootFolder <ListPipeBind> [-Includes <String[]>] [-AsListItem <SwitchParameter>] [-Connection <PnPConnection>] [-Verbose]
3535
```
3636

3737
### Folders In List
@@ -91,6 +91,13 @@ Get-PnPFolder -List "Shared Documents"
9191

9292
Returns the folders inside the root folder of the list called 'Shared Documents'. Please use Get-PnPFolder -ListRootFolder <folder> | Get-PnPFolderInFolder instead.
9393

94+
### EXAMPLE 7
95+
```powershell
96+
Get-PnPFolder -Url "/sites/demo/Shared Documents/Test" -AsListItem
97+
```
98+
99+
Returns the folder called 'Test' which is located in the root of the site collection located at '/sites/demo' inside 'Shared Documents' document library as a SharePoint list item.
100+
94101
## PARAMETERS
95102

96103
### -CurrentWebRootFolder
@@ -164,6 +171,20 @@ Accept pipeline input: True (ByValue)
164171
Accept wildcard characters: False
165172
```
166173
174+
### -AsListItem
175+
Returns the folder as a listitem showing all its properties
176+
177+
```yaml
178+
Type: SwitchParameter
179+
Parameter Sets: Folder by url, Root folder of a list
180+
181+
Required: False
182+
Position: Named
183+
Default value: None
184+
Accept pipeline input: False
185+
Accept wildcard characters: False
186+
```
187+
167188
### -Verbose
168189
When provided, additional debug statements will be shown while executing the cmdlet.
169190

src/Commands/Files/GetFolder.cs

Lines changed: 81 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class GetFolder : PnPWebRetrievalsCmdlet<Folder>
1515
private const string ParameterSet_FOLDERSINCURRENTWEB = "Folders in current Web";
1616
private const string ParameterSet_CURRENTWEBROOTFOLDER = "Root folder of the current Web";
1717
private const string ParameterSet_LISTROOTFOLDER = "Root folder of a list";
18-
private const string ParameterSet_FOLDERSINLIST = "Folders In List";
19-
private const string ParameterSet_FOLDERBYURL = "Folder by url";
18+
private const string ParameterSet_FOLDERSINLIST = "Folders In List";
19+
private const string ParameterSet_FOLDERBYURL = "Folder by url";
2020

2121
[Parameter(Mandatory = true, Position = 0, ValueFromPipeline = true, ParameterSetName = ParameterSet_FOLDERBYURL)]
2222
[Alias("RelativeUrl")]
@@ -32,94 +32,112 @@ public class GetFolder : PnPWebRetrievalsCmdlet<Folder>
3232
[Parameter(Mandatory = true, Position = 1, ParameterSetName = ParameterSet_CURRENTWEBROOTFOLDER)]
3333
public SwitchParameter CurrentWebRootFolder;
3434

35+
[Parameter(Mandatory = false, ParameterSetName = ParameterSet_FOLDERBYURL)]
36+
[Parameter(Mandatory = false, ParameterSetName = ParameterSet_LISTROOTFOLDER)]
37+
public SwitchParameter AsListItem;
38+
3539
protected override void ExecuteCmdlet()
3640
{
3741
DefaultRetrievalExpressions = new Expression<Func<Folder, object>>[] { f => f.ServerRelativeUrl, f => f.Name, f => f.TimeLastModified, f => f.ItemCount };
3842

3943
Folder folder = null;
40-
switch(ParameterSetName)
44+
switch (ParameterSetName)
4145
{
4246
case ParameterSet_FOLDERSINCURRENTWEB:
43-
{
44-
WriteVerbose("Getting all folders in the root of the current web");
45-
ClientContext.Load(CurrentWeb, w => w.Folders.IncludeWithDefaultProperties(RetrievalExpressions));
46-
ClientContext.ExecuteQueryRetry();
47-
WriteObject(CurrentWeb.Folders, true);
48-
break;
49-
}
47+
{
48+
WriteVerbose("Getting all folders in the root of the current web");
49+
ClientContext.Load(CurrentWeb, w => w.Folders.IncludeWithDefaultProperties(RetrievalExpressions));
50+
ClientContext.ExecuteQueryRetry();
51+
WriteObject(CurrentWeb.Folders, true);
52+
break;
53+
}
5054

5155
case ParameterSet_CURRENTWEBROOTFOLDER:
52-
{
53-
WriteVerbose("Getting root folder of the current web");
54-
folder = CurrentWeb.RootFolder;
55-
56-
ReturnFolderProperties(folder);
57-
break;
58-
}
56+
{
57+
WriteVerbose("Getting root folder of the current web");
58+
folder = CurrentWeb.RootFolder;
59+
60+
ReturnFolderProperties(folder);
61+
break;
62+
}
5963

6064
case ParameterSet_LISTROOTFOLDER:
61-
{
62-
WriteVerbose("Getting root folder of the provided list");
63-
var list = ListRootFolder.GetList(CurrentWeb);
64-
folder = list.RootFolder;
65-
66-
ReturnFolderProperties(folder);
67-
break;
68-
}
65+
{
66+
WriteVerbose("Getting root folder of the provided list");
67+
var list = ListRootFolder.GetList(CurrentWeb);
68+
folder = list.RootFolder;
69+
70+
ReturnFolderProperties(folder);
71+
break;
72+
}
6973

7074
case ParameterSet_FOLDERSINLIST:
71-
{
72-
// Gets the provided list
75+
{
76+
// Gets the provided list
7377
#pragma warning disable CS0618 // Type or member is obsolete
74-
var list = List.GetList(CurrentWeb);
78+
var list = List.GetList(CurrentWeb);
7579
#pragma warning restore CS0618 // Type or member is obsolete
7680

77-
// Query for all folders in the list
78-
CamlQuery query = CamlQuery.CreateAllFoldersQuery();
79-
do
80-
{
81-
// Execute the query. It will retrieve all properties of the folders. Refraining to using the RetrievalExpressions would cause a tremendous increased load on SharePoint as it would have to execute a query per list item which would be less efficient, especially on lists with many folders, than just getting all properties directly
82-
ListItemCollection listItems = list.GetItems(query);
83-
ClientContext.Load(listItems, item => item.Include(t => t.Folder), item => item.ListItemCollectionPosition);
84-
ClientContext.ExecuteQueryRetry();
85-
86-
// Take all the folders from the resulting list items and put them in a list to return
87-
var folders = new List<Folder>(listItems.Count);
88-
foreach (ListItem listItem in listItems)
81+
// Query for all folders in the list
82+
CamlQuery query = CamlQuery.CreateAllFoldersQuery();
83+
do
8984
{
90-
var listFolder = listItem.Folder;
91-
listFolder.EnsureProperties(RetrievalExpressions);
92-
folders.Add(listFolder);
93-
}
94-
95-
WriteObject(folders, true);
96-
97-
query.ListItemCollectionPosition = listItems.ListItemCollectionPosition;
98-
} while (query.ListItemCollectionPosition != null);
99-
break;
100-
}
85+
// Execute the query. It will retrieve all properties of the folders. Refraining to using the RetrievalExpressions would cause a tremendous increased load on SharePoint as it would have to execute a query per list item which would be less efficient, especially on lists with many folders, than just getting all properties directly
86+
ListItemCollection listItems = list.GetItems(query);
87+
ClientContext.Load(listItems, item => item.Include(t => t.Folder), item => item.ListItemCollectionPosition);
88+
ClientContext.ExecuteQueryRetry();
89+
90+
// Take all the folders from the resulting list items and put them in a list to return
91+
var folders = new List<Folder>(listItems.Count);
92+
foreach (ListItem listItem in listItems)
93+
{
94+
var listFolder = listItem.Folder;
95+
listFolder.EnsureProperties(RetrievalExpressions);
96+
folders.Add(listFolder);
97+
}
98+
99+
WriteObject(folders, true);
100+
101+
query.ListItemCollectionPosition = listItems.ListItemCollectionPosition;
102+
} while (query.ListItemCollectionPosition != null);
103+
break;
104+
}
101105

102106
case ParameterSet_FOLDERBYURL:
103-
{
104-
WriteVerbose("Getting folder at the provided url");
105-
var webServerRelativeUrl = CurrentWeb.EnsureProperty(w => w.ServerRelativeUrl);
106-
if (!Url.StartsWith(webServerRelativeUrl, StringComparison.OrdinalIgnoreCase))
107107
{
108-
Url = UrlUtility.Combine(webServerRelativeUrl, Url);
108+
WriteVerbose("Getting folder at the provided url");
109+
var webServerRelativeUrl = CurrentWeb.EnsureProperty(w => w.ServerRelativeUrl);
110+
if (!Url.StartsWith(webServerRelativeUrl, StringComparison.OrdinalIgnoreCase))
111+
{
112+
Url = UrlUtility.Combine(webServerRelativeUrl, Url);
113+
}
114+
folder = CurrentWeb.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(Url));
115+
116+
ReturnFolderProperties(folder);
117+
break;
109118
}
110-
folder = CurrentWeb.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(Url));
111-
112-
ReturnFolderProperties(folder);
113-
break;
114-
}
115119
}
116120
}
117121

118122
private void ReturnFolderProperties(Folder folder)
119123
{
120124
WriteVerbose("Retrieving folder properties");
121-
folder?.EnsureProperties(RetrievalExpressions);
122-
WriteObject(folder, false);
125+
126+
if (AsListItem.IsPresent)
127+
{
128+
folder?.EnsureProperties(RetrievalExpressions);
129+
folder?.EnsureProperties(f => f.Exists, f => f.ListItemAllFields);
130+
if (folder.Exists)
131+
{
132+
WriteObject(folder.ListItemAllFields);
133+
}
134+
}
135+
else
136+
{
137+
folder?.EnsureProperties(RetrievalExpressions);
138+
WriteObject(folder, false);
139+
}
140+
123141
}
124142
}
125143
}

0 commit comments

Comments
 (0)