{"id":13376,"date":"2017-02-27T06:00:26","date_gmt":"2017-02-27T14:00:26","guid":{"rendered":"https:\/\/www.sapien.com\/blog\/?p=13376"},"modified":"2017-03-01T08:40:49","modified_gmt":"2017-03-01T16:40:49","slug":"friday-puzzle-solution-why-doesnt-verbose-work","status":"publish","type":"post","link":"https:\/\/dev.sapien.com\/blog\/2017\/02\/27\/friday-puzzle-solution-why-doesnt-verbose-work\/","title":{"rendered":"Friday Puzzle Solution: Why doesn&#8217;t Verbose work?"},"content":{"rendered":"<p>On Friday, February 17, 2017, I posted the following puzzle on Twitter and <a href=\"https:\/\/www.facebook.com\/SAPIENTech\/photos\/a.10151095012027283.433079.82797372282\/10154321647172283\/?type=3&amp;permPage=1\" target=\"_blank\">Facebook <\/a>(and <a href=\"https:\/\/www.facebook.com\/groups\/powershell\/permalink\/1353565894701585\/?match=YmxlbmRlcix2ZXJib3Nl\" target=\"_blank\">here<\/a>!).<\/p>\n<p>It shows a PowerShell function with a <strong><a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/3.0\/microsoft.powershell.utility\/write-verbose\" target=\"_blank\">Write-Verbose<\/a><\/strong> command and asks &#8220;Why won&#8217;t this verbose string print?&#8221;<\/p>\n<p>You might think of this as a beginner puzzle, but after years of using PowerShell, I still hit this issue occasionally, and I&#8217;ve seen functions in the PowerShell Gallery just like this one.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13377\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55.png\" alt=\"\" width=\"807\" height=\"411\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55.png 1308w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55-300x153.png 300w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55-768x391.png 768w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55-1024x521.png 1024w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-24-09.21.55-848x432.png 848w\" sizes=\"auto, (max-width: 807px) 100vw, 807px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>To prove we have a problem, let&#8217;s dot-source the file and run the function. Our first clue is that PowerShell is not tab-completing the -v, no matter how many times you bang on the TAB key. (Tell me you try only once!)<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.40.15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13380\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.40.15.png\" alt=\"\" width=\"770\" height=\"188\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.40.15.png 963w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.40.15-300x73.png 300w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.40.15-768x187.png 768w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.40.15-848x207.png 848w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/a><\/p>\n<p>And, when you type the <strong>-Verbose<\/strong>, it has no effect.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.43.37.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13379\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.43.37.png\" alt=\"\" width=\"657\" height=\"119\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.43.37.png 679w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-09.43.37-300x54.png 300w\" sizes=\"auto, (max-width: 657px) 100vw, 657px\" \/><\/a><\/p>\n<p>What&#8217;s the problem?<\/p>\n<h1><\/h1>\n<h1>The Solution: Simple functions don&#8217;t have common parameters<\/h1>\n<p><strong>Verbose<\/strong> is one of the many, super-useful <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/5.0\/microsoft.powershell.core\/about\/about_commonparameters\" target=\"_blank\">common parameters<\/a> that Windows PowerShell adds to advanced functions. But, in its current incarnation, my Get-CultureDate function is a <em>simple<\/em> or <em>standard<\/em> PowerShell function, not an <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/5.0\/microsoft.powershell.core\/about\/about_functions_advanced\" target=\"_blank\">advanced function<\/a>. Windows PowerShell adds common parameters only to advanced functions.<\/p>\n<p>Get-Command -Syntax displays the function syntax. It confirms that our simple function does not have the PowerShell common parameters.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.21.49.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13386\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.21.49.png\" alt=\"\" width=\"689\" height=\"115\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.21.49.png 749w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.21.49-300x50.png 300w\" sizes=\"auto, (max-width: 689px) 100vw, 689px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>To convert my simple function into an advanced function, I have two options:<\/p>\n<ul>\n<li>Add a <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/3.0\/microsoft.powershell.core\/about\/about_functions_cmdletbindingattribute\" target=\"_blank\">CmdletBinding attribute<\/a><br \/>\n-or-<\/li>\n<li>Add a <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/3.0\/microsoft.powershell.core\/about\/about_functions_advanced_parameters\" target=\"_blank\">Parameter attribute<\/a><\/li>\n<\/ul>\n<h1><\/h1>\n<h1>Add the CmdletBinding attribute<\/h1>\n<p>To convert a simple function to an advanced function, add the <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/3.0\/microsoft.powershell.core\/about\/about_functions_cmdletbindingattribute\" target=\"_blank\">CmdletBinding attribute<\/a>. It&#8217;s valid on any script or function. You can use its parameters, such as DefaultParameterSetName, HelpUri (supports online help), and SupportsShouldProcess (add WhatIf and Confirm parameters). But you can also add it without any CmdletBinding parameters. In that case, the parentheses that enclose its parameters is still required, but the parameters are not required.<\/p>\n<pre lang=\"PowerShell\">function Get-CultureDate\r\n{\r\n    [CmdletBinding()]    # Add CmdletBinding attribute\r\n    param\r\n    (\r\n        [System.DateTime]\r\n        $Date = (Get-Date),\r\n        \r\n        [string[]]\r\n        $Culture = 'en-US'\r\n    )\r\n...\r\n\r\n<\/pre>\n<p>To see the effect, use Get-Command -Syntax.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.43.12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13394\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.43.12.png\" alt=\"\" width=\"740\" height=\"97\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.43.12.png 878w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.43.12-300x39.png 300w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.43.12-768x101.png 768w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.43.12-848x111.png 848w\" sizes=\"auto, (max-width: 740px) 100vw, 740px\" \/><\/a><\/p>\n<p>And, the Verbose parameter works.<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.44.53.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13395\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.44.53.png\" alt=\"\" width=\"893\" height=\"158\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.44.53.png 893w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.44.53-300x53.png 300w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.44.53-768x136.png 768w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.44.53-848x150.png 848w\" sizes=\"auto, (max-width: 893px) 100vw, 893px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Remember that when you add a CmdletBinding attribute to a function, you must add a Param block. It&#8217;s required with CmdletBinding, even when the function has no parameters.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.33.32.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13391\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.33.32.png\" alt=\"\" width=\"246\" height=\"171\" \/><\/a><\/p>\n<p>If you omit the Param block, you get a syntax error. This error is not very helpful, but you can eliminate it by adding <strong>Param()<\/strong>.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.33.08.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13392\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.33.08.png\" alt=\"\" width=\"501\" height=\"137\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.33.08.png 501w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-11.33.08-300x82.png 300w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h1>Add a Parameter attribute<\/h1>\n<p>The CmdletBinding attribute is sufficient for an advanced function, but it&#8217;s not required. The Parameter attribute works, too.<\/p>\n<p>Typically, you add a <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/3.0\/microsoft.powershell.core\/about\/about_functions_advanced_parameters\" target=\"_blank\">Parameter attribute<\/a> when you want to use one of the Parameter attribute parameters, like Mandatory or <a href=\"http:\/\/info.sapien.com\/scripting\/scripting-how-tos\/take-values-from-the-pipeline-in-powershell\" target=\"_blank\">ValueFromPipeline<\/a>. But, you can add a parameter attribute with no Parameter-attribute-parameters. Just use empty parentheses.<\/p>\n<pre lang=\"PowerShell\">function Get-CultureDate\r\n{\r\n    param\r\n    (\r\n        [Parameter()]     # Add a parameter attribute\r\n        [System.DateTime]\r\n        $Date = (Get-Date),\r\n        \r\n        [string[]]\r\n        $Culture\r\n    )\r\n...<\/pre>\n<p>When you add the Parameter attribute, Windows PowerShell adds the common parameters to your new advanced function.<\/p>\n<p>In this case, we&#8217;ll make the Culture parameter mandatory.<\/p>\n<pre lang=\"PowerShell\">function Get-CultureDate\r\n{\r\n\u00a0\u00a0 \u00a0param\r\n\u00a0\u00a0 \u00a0(\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0[System.DateTime]\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$Date = (Get-Date),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n        [Parameter(Mandatory)]     # Add a parameter attribute\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0[string[]]\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$Culture\r\n\u00a0\u00a0 \u00a0)\r\n...<\/pre>\n<p>Get-Command -Syntax shows the effect.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.20.58-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13389 \" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.20.58-1.png\" width=\"729\" height=\"88\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.20.58-1.png 828w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.20.58-1-300x36.png 300w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.20.58-1-768x93.png 768w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/a><\/p>\n<p>And, now, the Verbose parameter works with this function.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.19.00-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13390 \" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.19.00-1.png\" width=\"706\" height=\"114\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.19.00-1.png 743w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2018\/02\/Screenshot-2017-02-24-10.19.00-1-300x48.png 300w\" sizes=\"auto, (max-width: 706px) 100vw, 706px\" \/><\/a><\/p>\n<h1><\/h1>\n<h1>Use the Write-Verbose -Verbose Parameter?<\/h1>\n<p>Another possible solution to this puzzle is to add the <strong>Verbose<\/strong> parameter to the <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/3.0\/microsoft.powershell.utility\/write-verbose\" target=\"_blank\">Write-Verbose<\/a> command in the script.<\/p>\n<pre lang=\"PowerShell\">Write-Verbose -Message \"Processing culture: $strCulture\" -Verbose<\/pre>\n<p>The <strong>Verbose<\/strong> parameter doesn&#8217;t have any effect on a standard function that doesn&#8217;t have the parameter, but it certainly has an effect on the Write-Verbose cmdlet, which has the PowerShell common parameters.<\/p>\n<p>Unfortunately, the effect is not what you might want for your user experience. Adding -Verbose in the script overrides the value of the user&#8217;s <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/5.1\/microsoft.powershell.core\/about\/about_preference_variables\" target=\"_blank\">VerbosePreference <\/a>setting and <em><strong>always<\/strong><\/em> displays the verbose message, even if the user doesn&#8217;t want it. In fact, the user can&#8217;t suppress it.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-27-08.31.15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13430\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-27-08.31.15.png\" alt=\"\" width=\"562\" height=\"225\" srcset=\"https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-27-08.31.15.png 649w, https:\/\/dev.sapien.com\/blog\/wp-content\/uploads\/2017\/02\/Screenshot-2017-02-27-08.31.15-300x120.png 300w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><\/a><\/p>\n<p>This is really a poor user experience, and I wouldn&#8217;t recommend it. Sometimes, even if something works, you shouldn&#8217;t do it.<\/p>\n<p>It&#8217;s best to add the common parameters to your function and let the user determine whether and when they want to see verbose messages.<\/p>\n<p>&nbsp;<\/p>\n<h1>What about VerbosePreference?<\/h1>\n<p>Resetting the value of the <a href=\"https:\/\/msdn.microsoft.com\/en-us\/powershell\/reference\/5.1\/microsoft.powershell.core\/about\/about_preference_variables\"><strong>VerbosePreference<\/strong> <\/a>variable is another possible solution that I wouldn&#8217;t recommend.<\/p>\n<p>In a complex language like PowerShell, it&#8217;s sometimes difficult to distinguish a bug from a feature. For me, that&#8217;s the case for the behavior of VerbosePreference. In practice, I never change the values of the preference variables in a script or module, because they affect all commands and modules in the session and, worst of all, they override the preference that the user sets for their session, often without warning. And, the user cannot turn it off.<\/p>\n<p>If a user elects to change their VerbosePreference, that&#8217;s fine, but I script shouldn&#8217;t force a setting on the user.<\/p>\n<h1>Summary<\/h1>\n<p>In our puzzle, we tried to use a common parameter on a simple function that doesn&#8217;t have common parameters. But, it&#8217;s easy to convert a simple function to an advanced function. Just add the CmdletBinding attribute or the Parameter attribute.<\/p>\n<hr \/>\n<p>Like this PowerShell puzzle? Our <a href=\"https:\/\/github.com\/SAPIENTechnologies\/FridayPowerShellPuzzle\" target=\"_blank\">FridayPowerShellPuzzle repository<\/a> includes all of the SAPIEN Technologies Friday PowerShell puzzles without the solutions, so you&#8217;re not even tempted to peek.<\/p>\n<p>To read the solutions to our Friday PowerShell Puzzles, see <a href=\"https:\/\/www.sapien.com\/blog\/topics\/puzzle\/\" target=\"_blank\">Friday Puzzle Solutions<\/a> in the <a href=\"http:\/\/sapien.com\/blog\" target=\"_blank\">SAPIEN blog<\/a>.<\/p>\n<p><em>June Blender is a technology evangelist at SAPIEN Technologies, Inc. and a Microsoft Cloud and Datacenter MVP. You can reach her at <span id=\"cloak6d9f911c8cd41f659453369c90d0035b\"><span id=\"cloakad04beb49f36e31a7a78b02b4febca56\"><span id=\"cloakd85cc3788e2939e8baccb499545fdc5b\"><span id=\"cloaka5f859c73b9cefc030c4b5615985178d\"><a href=\"mailto:juneb@sapien.com\">juneb@sapien.com<\/a><\/span><\/span><\/span><\/span> or follow her on Twitter at <a href=\"https:\/\/twitter.com\/juneb_get_help\" target=\"_blank\">@juneb_get_help<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On Friday, February 17, 2017, I posted the following puzzle on Twitter and Facebook (and here!). It shows a PowerShell function with a Write-Verbose command and asks &#8220;Why won&#8217;t this verbose string print?&#8221; You might think of this as a beginner puzzle, but after years of using PowerShell, I still hit this issue occasionally, and [&hellip;]<\/p>\n","protected":false},"author":31,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[932,283,1143,1182,1055],"tags":[1194,1187,934,1193,1186,57],"class_list":["post-13376","post","type-post","status-publish","format-standard","hentry","category-beginners","category-howto","category-powershell","category-puzzle","category-scripting","tag-friday-powershell-puzzle","tag-friday-puzzle","tag-juneb","tag-powershell-puzzle","tag-puzzle","tag-scripting"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts\/13376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/users\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/comments?post=13376"}],"version-history":[{"count":17,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts\/13376\/revisions"}],"predecessor-version":[{"id":13458,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts\/13376\/revisions\/13458"}],"wp:attachment":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/media?parent=13376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/categories?post=13376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/tags?post=13376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}