{"id":1289,"date":"2012-09-05T11:33:21","date_gmt":"2012-09-05T11:33:21","guid":{"rendered":"https:\/\/poiseddevelopers.com\/reality-tech\/?p=1289"},"modified":"2024-05-13T10:51:51","modified_gmt":"2024-05-13T10:51:51","slug":"metadata-defaults-for-folders","status":"publish","type":"post","link":"https:\/\/poiseddevelopers.com\/reality-tech\/metadata-defaults-for-folders\/","title":{"rendered":"Metadata Defaults for Folders"},"content":{"rendered":"<h2>Setting Metadata Defaults for Folders<\/h2>\n<p>SharePoint Libraries can be configured with metadata defaults for documents added to specific folders.<\/p>\n<p>Column Defaults are manually configurable in Library Settings.\u00a0 For each folder that has metadata defaults, the folder is marked with a green stamp.<\/p>\n<p>Any document added to the folder gets the default metadata by default<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-1295 size-full\" src=\"https:\/\/poiseddevelopers.com\/reality-tech\/wp-content\/uploads\/2024\/03\/column-defaults.webp\" alt=\"img\" width=\"618\" height=\"463\" srcset=\"https:\/\/poiseddevelopers.com\/reality-tech\/wp-content\/uploads\/2024\/03\/column-defaults.webp 618w, https:\/\/poiseddevelopers.com\/reality-tech\/wp-content\/uploads\/2024\/03\/column-defaults-300x225.webp 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>This configuration can be done using PowerShell.\u00a0 In this example, I have created Folder Content Types, by defining them as inheriting from the Folder Content Type, then adding metadata to the folder Content Types.\u00a0 This makes it easy to then assign the metadata defaults.<\/p>\n<p>We can clear away any existing metadata defaults on a folder using these commands to grab a metadata defaults object, then call the RemoveAllFieldDefaults() method:<\/p>\n<div><\/div>\n<pre lang=\"php\">  [Microsoft.Office.DocumentManagement.MetadataDefaults] $columnDefaults = new-object Microsoft.Office.DocumentManagement.MetadataDefaults($JPLib);\r\n$nuthin=$columnDefaults.RemoveAllFieldDefaults($JPFolder.Folder); \r\n$columnDefaults.update()<\/pre>\n<p>We can assign a metadata default for one field for one folder using these commands:<\/p>\n<div><\/div>\n<pre lang=\"php\">  [Microsoft.Office.DocumentManagement.MetadataDefaults] $columnDefaults = new-object Microsoft.Office.DocumentManagement.MetadataDefaults($JPLib);\r\n$nuthin=$columnDefaults.SetFieldDefault($JPFolder.Folder, $InternalName, $AssignmentValue);\r\n$columnDefaults.update()<\/pre>\n<p>Before we get to the script, it is very important to note that get SPSite and SPWeb object must be acquired using the precise correct case.<\/p>\n<p>It seems the case-sensitive XML underlying these calls is affected by an incorrect case; the folders will get the green stamp, but the metadata defaults won\u2019t be applied unless the case is exactly correct.<\/p>\n<p>To get around this problem, you can grab all SPSites for a Web Application and pipe them to get the SPWebs to process.<\/p>\n<p>The only problem with that approach is the extreme memory inefficiency.<\/p>\n<p>More than that, until the objects are totally released, the changes accrue in the SQL Transaction Log until released, allowing .NET to commit them.<\/p>\n<p>Also note the SPFolder object does not require an update(), as the metadata default methods handle the update.<\/p>\n<p>Here\u2019s the full script:<\/p>\n<pre lang=\"php\">#already matched to the Claim Folder Fields on 9\/4\/12 to confirm all necessary fields are included. no changes actually made.\r\n#Added CT filtering on these folder CTs: Claim Acct Folder|Claims Common Folder\r\n \r\n[system.reflection.assembly]::LoadWithPartialName(\"Microsoft.SharePoint\") \r\n \r\n$Action=\"WipeAndApplyDefaults\"\r\n#$Action=\"ApplyDefaults\"\r\n#$Action=\"WipeDefaults\"\r\n \r\n$FolderFields=\"Field1,Field2,Field3\"\r\n$FolderFieldsArr=$FolderFields.split(\",\");\r\n \r\n$baseURL=\"http :\/\/SharePoint\/ManagedPath\/\"\r\n$SiteURL=\"http :\/\/SharePoint\/ManagedPath\/a\"\r\n$OutputSuffix=\"A\"\r\n \r\n$mylogfile=$mylogfile=\"L:PowerShellLoggingMetadataDefaults$($OutputSuffix).csv\"\r\n#$WebAppHeading=\"http :\/\/SharePoint\"\r\n    \r\nWrite-Host (\"$(get-date) Running script assign metadata defaults to folders\")\r\n \r\nif ($siteurl)\r\n{\r\n    write-host $site.Url\r\n \r\n    $WebScope=start-SPAssignment\r\n    $TargetWeb=$WebScope | Get-SPWeb $siteURL;\r\n \r\n    $ListOfLists = @();\r\n \r\n# Loop through all doc libs\r\n \r\n    $lists=$TargetWeb.lists;\r\n    $listsCount=$lists.count\r\n     \r\n    for ($ii=0; $ii -lt $listsCount; $ii++)\r\n    {\r\n    $JPlib=$lists[$ii];\r\n         \r\n       if ( ($JPlib.BaseType -ne \"DocumentLibrary\") -or ($JPlib.hidden) )\r\n        {\r\n          # forget the rest and return to top\r\n          Write-Host -foregroundcolor darkred \"fast test skipping Library: $($JPlib)\";   \r\n        }\r\n        elseif ($JPLib.Title -Match \"Photo|Image|SitesAssets|CustomizedsReports|Templates|Pages|Picture|cache|style\")\r\n        {\r\n          # forget the rest and return to top\r\n          Write-Host -foregroundcolor darkred \"fast test skipping Library because it mentions $Matches: $($JPlib)\";   \r\n        }\r\n    else\r\n    {\r\n        $ListOfLists += $JPlib.title;\r\n    }\r\n    }\r\n    $TargetWeb.dispose();\r\n    $JPlib=$null;\r\n    stop-SPAssignment $WebScope\r\n \r\n     \r\n    foreach ($CurrentLib in $ListofLists)\r\n    {\r\n    $WebScope=start-SPAssignment\r\n    $TargetWeb=$WebScope | Get-SPWeb $siteURL;\r\n     \r\n    $JPlib=$TargetWeb.lists[$CurrentLib];\r\n    $JPlib.title\r\n    if ($JPlib -eq $null)\r\n    {\r\n        Write-Host \"COULD NOT GET LIB $($CurrentLib)\"\r\n        continue;\r\n    }\r\n         \r\n    $JPFolders=$JPlib.Folders;\r\n    $JPCount=$JPFolders.get_count();\r\n    for ($i=0; $i -lt $JPCount; $i++)  #Do not use ItemCount, that one includes folders!\r\n    {   \r\n     \r\n        $JPFolder=$JPFolders[$i];\r\n        $CT=$JPFolder.contenttype.name;\r\n         \r\n        if ($CT -notmatch \"Folder CT1|Folder CT2\")\r\n        {\r\n            Write-Host \"+\" -NoNewline\r\n             \r\n            if (($Action -eq \"WipeDefaults\") -or ($Action -eq \"WipeAndApplyDefaults\"))\r\n            {\r\n                    [Microsoft.Office.DocumentManagement.MetadataDefaults] $columnDefaults = new-object Microsoft.Office.DocumentManagement.MetadataDefaults($JPLib);\r\n                    $nuthin=$columnDefaults.RemoveAllFieldDefaults($JPFolder.Folder); \r\n                    $columnDefaults.update()\r\n             \r\n            }\r\n             \r\n            if (($Action -eq \"ApplyDefaults\") -or ($Action -eq \"WipeAndApplyDefaults\"))\r\n            {\r\n            foreach ($FF in $FolderFieldsArr)\r\n            {\r\n                try\r\n                {\r\n                    if ($JPFolder[$FF] -ne $null)\r\n                    {\r\n                 \r\n                        $TargetField=$JPFolder.Fields[$FF];\r\n                         \r\n                        $InternalName=$TargetField.InternalName; \r\n                        if (($TargetField.type -eq \"DateTime\") -or ($TargetField.type -eq \"Date\"))\r\n                        {\r\n                            $AssignmentValue=Get-Date $JPFolder[$FF] -Format u; #Z style universal format for assignment\r\n                        }\r\n                        else\r\n                        {\r\n                            $AssignmentValue=$JPFolder[$FF].tostring()\r\n                        } #Leaves open all kinds of field type challenges, such as Managed Metadata\r\n                         \r\n                        if ($AssignmentValue -ne $null)\r\n                        {\r\n                            [Microsoft.Office.DocumentManagement.MetadataDefaults] $columnDefaults = new-object Microsoft.Office.DocumentManagement.MetadataDefaults($JPLib);\r\n                            $nuthin=$columnDefaults.SetFieldDefault($JPFolder.Folder, $InternalName, $AssignmentValue); \r\n                            $columnDefaults.update()\r\n                        }\r\n                    }\r\n                }\r\n                catch \r\n                {\r\n                Write-Host \"problem with field $($FF)\"\r\n                } #must have been a field I shouldn't be poking, no biggie\r\n            }\r\n            } #Action=ApplyDefaults\r\n     \r\n#folder update is not required, columnDefault update propagates immediately\r\n \r\n}\r\n         \r\n            } # loop for items\r\n        $JPlib.Update();\r\n        $JPlib=$null;       \r\n        $Targetweb.update()\r\n        $TargetWeb.dispose();\r\n        Stop-SPAssignment $WebScope\r\n    } #Only process this lib\r\n     \r\n}# Lib loop\r\nWrite-Host \"SCRIPT COMPLETE $(get-date)\"<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Setting Metadata Defaults for Folders SharePoint Libraries can be configured with metadata defaults for documents added to specific folders. Column Defaults are manually configurable in Library Settings.\u00a0 For each folder that has metadata defaults, the folder is marked with a green stamp. Any document added to the folder gets the default metadata by default &nbsp; [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":1292,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[39],"tags":[],"class_list":["post-1289","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-content-types"],"acf":[],"_links":{"self":[{"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/posts\/1289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/comments?post=1289"}],"version-history":[{"count":2,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/posts\/1289\/revisions"}],"predecessor-version":[{"id":3965,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/posts\/1289\/revisions\/3965"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/media\/1292"}],"wp:attachment":[{"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/media?parent=1289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/categories?post=1289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/poiseddevelopers.com\/reality-tech\/wp-json\/wp\/v2\/tags?post=1289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}