{"id":8511,"date":"2012-08-02T00:01:00","date_gmt":"2012-08-02T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2012\/08\/02\/use-powershell-to-find-specific-word-built-in-properties\/"},"modified":"2012-08-02T00:01:00","modified_gmt":"2012-08-02T00:01:00","slug":"use-powershell-to-find-specific-word-built-in-properties","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/use-powershell-to-find-specific-word-built-in-properties\/","title":{"rendered":"Use PowerShell to Find Specific Word Built-in Properties"},"content":{"rendered":"<p align=\"left\"><b>Summary<\/b>: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to find specific built-in properties from Word documents.<\/p>\n<p align=\"left\">Microsoft Scripting Guy, Ed Wilson, is here. Well the script for today took a bit of work &hellip; actually it took quite a bit of work. The script does the following:<\/p>\n<ul>\n<li>Searches a specific folder for Word documents<\/li>\n<li>Creates an array of specific Word document properties from the Word built-in document properties enumeration. The <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/microsoft.office.core.documentproperty\" target=\"_blank\">built-in Word properties<\/a> are listed on MSDN.<\/li>\n<li>Retrieves the specific built-in Word properties and their associated value<\/li>\n<li>Creates a custom Windows PowerShell object with each of the specified properties, in addition to the full path to the Word document<\/li>\n<\/ul>\n<p align=\"left\">Today&rsquo;s script is similar to the <a href=\"http:\/\/blogs.technet.com\/b\/heyscriptingguy\/archive\/2012\/08\/01\/find-all-word-documents-that-contain-a-specific-phrase.aspx\" target=\"_blank\">Find All Word Documents that Contain a Specific Phrase<\/a><i> <\/i>script from yesterday, so reviewing that posting would be a good thing to do. This script also accomplishes a few of the things I wanted to do in yesterday&rsquo;s script that I did not get a chance to do&mdash;namely, I return a custom object that contains the built-in properties I choose. This is a great benefit because it permits further analysis and processing of the data&shy;&shy;&mdash;and it would even permit export to a CSV file if I wish.<\/p>\n<h1 align=\"left\">Working with Word Document properties<\/h2>\n<p align=\"left\">It is very difficult to work with Word document properties, and <a href=\"http:\/\/blogs.technet.com\/search\/searchresults.aspx?q=Word%20properties&amp;sections=7618\" target=\"_blank\">I have written several blogs about this<\/a>. You should refer to those blogs for additional information. The first thing I do is create a couple of command-line parameters. This permits changing the path to search, as well as modifying the <b>include<\/b><i> <\/i>filter that is used by the <b>Get-ChildItem<\/b> cmdlet. Next, I create the <b>Word.Application<\/b> object and set it to be invisible. Next, I need to create <b>BindingFlags<\/b> and <b>WdSaveOptions<\/b>. The reason for creating <b>WdSaveOptions<\/b> is to keep Word from modifying the last save option on the Word files. Finally, I obtain a collection of <b>fileinfo<\/b> objects and store the returned objects in the <b>$docs<\/b> variable. This portion of the script is shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Param(<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp; $path = &#8220;C:fso&#8221;,<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp; [array]$include = @(&#8220;HSG*.docx&#8221;,&#8221;WES*.docx&#8221;))<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">$AryProperties = &#8220;Title&#8221;,&#8221;Author&#8221;,&#8221;Keywords&#8221;, &#8220;Number of words&#8221;, &#8220;Number of pages&#8221;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">$application = New-Object -ComObject word.application<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">$application.Visible = $false<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">$binding = &#8220;System.Reflection.BindingFlags&#8221; -as [type]<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">[ref]$SaveOption = &#8220;microsoft.office.interop.word.WdSaveOptions&#8221; -as [type]<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">$docs = Get-childitem -path $Path -Recurse -Include $include&nbsp;<\/p>\n<p align=\"left\">Now I need to walk through the collection of documents. I use the <b>foreach<\/b><i> <\/i>statement. Inside the <b>foreach<\/b><i> <\/i>loop, I open each document,and return the <b>BuiltInDocumentProperties<\/b> collection. I also create a hash table that I will use to create the custom object later in the script. This portion of the code is shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Foreach($doc in $docs)<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;{<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp; $document = $application.documents.open($doc.fullname)<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp; $BuiltinProperties = $document.BuiltInDocumentProperties<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp; $objHash = @{&#8220;Path&#8221;=$doc.FullName}<\/p>\n<p align=\"left\">It is time to work through the array of built in properties that I selected earlier. To do this, once again I use a <b>foreach<\/b><i> <\/i>statement. I use <b>Try<\/b>&nbsp; when attempting to access each built-in property because an error generates if the property contains no value. I already know the name of the property that I desire to obtain; therefore, I use it directly when obtaining the value of the property. Both the name and the value of the built-in document properties are assigned to the hash table as a keyvalue pair. If an error occurs, I print a message via <b>Write-Host<\/b> that the value was not found. I use <b>Write-Host<\/b> for this so I can specify the color (blue). The code is shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">foreach($p in $AryProperties)<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; {Try<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp; {<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pn = [System.__ComObject].invokemember(&#8220;item&#8221;,$binding::GetProperty,$null,$BuiltinProperties,$p)<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $value = [System.__ComObject].invokemember(&#8220;value&#8221;,$binding::GetProperty,$null,$pn,$null)<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $objHash.Add($p,$value) }<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp; Catch [system.exception]<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { write-host -foreground blue &#8220;Value not found for $p&#8221; }&nbsp;<\/p>\n<p align=\"left\">I then create a new custom <b>PSObject<\/b> and use the hash table for the properties of that object. I display that object, and close the Word document without saving any changes. Finally, I release the document object and the <b>BuiltInProperties<\/b> object, and I continue to loop through the collection of documents. This code is shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp; &nbsp;$docProperties = New-Object psobject -Property $objHash<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp; $docProperties<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp; $document.close([ref]$saveOption::wdDoNotSaveChanges)<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp; [System.Runtime.InteropServices.Marshal]::ReleaseComObject($BuiltinProperties) | Out-Null<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp; [System.Runtime.InteropServices.Marshal]::ReleaseComObject($document) | Out-Null<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp; Remove-Variable -Name document, BuiltinProperties<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;&nbsp; }<\/p>\n<p align=\"left\">&nbsp;When I have completed processing the collection of documents, I release the <b>Word.Application<\/b> COM object and call garbage collection. This code is shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">$application.quit()<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">[System.Runtime.InteropServices.Marshal]::ReleaseComObject($application) | Out-Null<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Remove-Variable -Name application<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">[gc]::collect()<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">[gc]::WaitForPendingFinalizers()&nbsp;<\/p>\n<h2 align=\"left\">Using the returned objects<\/h2>\n<p align=\"left\">One reason for returning an object is that it allows for grouping, sorting, and for further processing. I could have written everything in a function, but it works just as well as a script. For example, when I run the script, it returns the following objects.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">PS C:&gt; C:dataScriptingGuys2012HSG_7_30_12Get-SpecificDocumentProperties.ps1<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:fsoHSG-7-23-12.docx<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Number of words : 1398<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Number of pages : 4<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : edwils<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Keywords&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:fsoHSG-7-24-12.docx<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Number of words : 1035<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Number of pages : 4<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : edwils<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Keywords&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : guest blogger, powershell<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : &nbsp;<\/p>\n<p align=\"left\">Because the objects return from the script, I can search the output and find only documents that contain the word &ldquo;guest blogger&rdquo; as shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">PS C:&gt; C:dataScriptingGuys2012HSG_7_30_12Get-SpecificDocumentProperties.ps1 | where keywords -match &#8220;guest blogger&#8221;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:fsoHSG-7-24-12.docx<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Number of words : 1035<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Number of pages : 4<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : edwils<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Keywords&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : guest blogger, powershell<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;<\/p>\n<p align=\"left\">It is even possible to modify the way the output appears and to split only the file name from the remainder of the path. This is shown here.<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">PS C:&gt; C:dataScriptingGuys2012HSG_7_30_12Get-SpecificDocumentProperties.ps1 | sort &#8220;number of words&#8221; -Descending | select @{LABEL=&#8221;file&#8221;;EXPRESSION={split-path $_.path -Leaf}}, &#8220;number of words&#8221;, author, keywords | ft -AutoSize<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number of words Author Keywords&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212; &#8212;&#8212;&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-7-23-12.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1398 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-7-27-12.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1208 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-8-2-11.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1206 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">hsg-9-28-11.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1131 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-7-24-12.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1035 edwils guest blogger, powershell<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-8-1-11.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 963 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-7-25-12.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 882 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">HSG-7-26-12.docx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 848 edwils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p align=\"left\" style=\"padding-left: 30px\">PS C:&gt;&nbsp;&nbsp;<\/p>\n<p align=\"left\"><a href=\"http:\/\/gallery.technet.microsoft.com\/scriptcenter\/Get-Word-built-in-document-a688a1ce\" target=\"_blank\">The complete Get-SpecificDocumentProperties.ps1 script<\/a> is on the Scripting Guys Script Repository.&nbsp;<\/p>\n<p align=\"left\">Join me tomorrow when I will talk about programmatically assigning values to the Word documents.<\/p>\n<p align=\"left\">I invite you to follow me on <a href=\"http:\/\/bit.ly\/scriptingguystwitter\" target=\"_blank\">Twitter<\/a> and <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\" target=\"_blank\">Facebook<\/a>. If you have any questions, send email to me at <a href=\"http:\/\/blogs.technet.commailto:scripter@microsoft.com\" target=\"_blank\">scripter@microsoft.com<\/a>, or post your questions on the <a href=\"http:\/\/bit.ly\/scriptingforum\" target=\"_blank\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.<\/p>\n<p align=\"left\"><b>Ed Wilson, Microsoft Scripting Guy<\/b><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to find specific built-in properties from Word documents. Microsoft Scripting Guy, Ed Wilson, is here. Well the script for today took a bit of work &hellip; actually it took quite a bit of work. The script does the following: Searches a specific folder for [&hellip;]<\/p>\n","protected":false},"author":596,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[359,3,45,360],"class_list":["post-8511","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-microsoft-office","tag-scripting-guy","tag-windows-powershell","tag-word"],"acf":[],"blog_post_summary":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to find specific built-in properties from Word documents. Microsoft Scripting Guy, Ed Wilson, is here. Well the script for today took a bit of work &hellip; actually it took quite a bit of work. The script does the following: Searches a specific folder for [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/8511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/596"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=8511"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/8511\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=8511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=8511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=8511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}