{"id":2591,"date":"2012-11-23T13:28:29","date_gmt":"2012-11-23T18:28:29","guid":{"rendered":"http:\/\/jdhitsolutions.com\/blog\/?p=2591"},"modified":"2013-11-01T07:54:48","modified_gmt":"2013-11-01T11:54:48","slug":"friday-fun-testing-google-chrome-bookmarks-with-powershell","status":"publish","type":"post","link":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/","title":{"rendered":"Friday Fun: Testing Google Chrome Bookmarks with PowerShell"},"content":{"rendered":"<p>I was cleaning up and organizing bookmarks in Google Chrome today and decided to find out where they were stored on my computer. I found the Bookmarks file in a local app data folder. Opening it up in Notepad I was pleasantly surprised to discover it is in JSON. Excellent! This gives me an opportunity to try out some of the new web cmdlets in PowerShell v3 and build a little tool to help find broken links.<\/p>\n<p>The first step is to convert the file from JSON into PowerShell objects.<\/p>\n<pre class=\"lang:ps decode:true \" >$File = \"$env:localappdata\\Google\\Chrome\\User Data\\Default\\Bookmarks\"\r\n$data = Get-content $file | out-string | ConvertFrom-Json\r\n<\/pre>\n<p>To convert from JSON, the input needs to be one long string. Get-Content writes an array of strings so by piping to Out-String first, ConvertFrom-JSON is happy. Here's what I end up with.<\/p>\n<pre class=\"lang:ps decode:true \" >$data\r\n\r\nchecksum                                roots                                                      version\r\n--------                                -----                                                      -------\r\n03a5a00f42bb4860f6f8dd4d543e34af        @{bookmark_bar=; other=; synced=}                                1\r\n<\/pre>\n<p>The roots property is where things are stored.<\/p>\n<pre class=\"lang:ps decode:true \" >$data.roots | format-list\r\n\r\nbookmark_bar : @{children=System.Object[]; date_added=12989558548133917; date_modified=12998163702118866; id=1;\r\n               name=Bookmarks bar; type=folder}\r\nother        : @{children=System.Object[]; date_added=12989558548133917; date_modified=12998151911083334; id=2;\r\n               name=Other bookmarks; type=folder}\r\nsynced       : @{children=System.Object[]; date_added=12989558548133917; date_modified=0; id=3; name=Mobile bookmarks;\r\n               type=folder}\r\n<\/pre>\n<p>As far as I know these are hard-coded properties. Each property can have a nested property called children which will be a collection of bookmarks and subfolders.<\/p>\n<pre class=\"lang:ps decode:true \" >$data.roots.bookmark_bar\r\n\r\n\r\nchildren      : {@{date_added=12993566428951635; id=67; name=PowerShell.org \u2022 View unanswered posts; type=url;\r\n                url=http:\/\/powershell.org\/discuss\/search.php?search_id=unanswered}, @{date_added=12989558569500214;\r\n                id=5; name=HostGator.com Control Panel; type=url;\r\n                url=http:\/\/gator1172.hostgator.com:2082\/frontend\/x3\/index.php?post_login=91229198020615},\r\n                @{date_added=12989558569506214; id=7; name=Vet Followers; type=url;\r\n                url=https:\/\/www.socialoomph.com\/vetfollowers}, @{date_added=12989558569508214; id=8; name=Google+;\r\n                type=url;\r\n                url=https:\/\/plus.google.com\/up\/start\/?continue=https:\/\/plus.google.com\/&amp;type=st&amp;gpcaz=3cba226a}...}\r\ndate_added    : 12989558548133917\r\ndate_modified : 12998163702118866\r\nid            : 1\r\nname          : Bookmarks bar\r\ntype          : folder\r\n<\/pre>\n<p>Here's what an child item looks like:<\/p>\n<p>date_added : 12998151910630334<br \/>\nid         : 76<br \/>\nname       : Facebook<br \/>\ntype       : url<br \/>\nurl        : http:\/\/www.facebook.com\/<\/p>\n<p>Awesome. All I need to do is get the url.<\/p>\n<pre class=\"lang:ps decode:true \" >$data.roots.bookmark_bar.children | select Name,url\r\n\r\nname                                                        url\r\n----                                                        ---\r\nPowerShell.org \u2022 View unanswered posts                      http:\/\/powershell.org\/discuss\/search.php?search_id=unans...\r\nHostGator.com Control Panel                                 http:\/\/gator1172.hostgator.com:2082\/frontend\/x3\/index.ph...\r\nVet Followers                                               https:\/\/www.socialoomph.com\/vetfollowers\r\nGoogle+                                                     https:\/\/plus.google.com\/up\/start\/?continue=https:\/\/plus....\r\nBottlenose                                                  http:\/\/bottlenose.com\/home#streams\/everything\r\nPower Tweet                                                 javascript:(function(){url=\"http:\/\/www.twylah.com\/bookma...\r\nFacebook                                                    http:\/\/www.facebook.com\/\r\nBlog Dashboard                                              http:\/\/jdhitsolutions.com\/blog\/wp-admin\/index.php\r\n<\/pre>\n<p>To validate if the URL is good, I can use Invoke-Webrequest.<\/p>\n<pre class=\"lang:ps decode:true \" >invoke-webrequest -Uri http:\/\/www.facebook.com  -UseBasicParsing | Select StatusCode\r\n  StatusCode\r\n  ----------\r\n         200\r\n<\/pre>\n<p>All I want is the status code so I'm using basic parsing to speed things up. Now that I have the basics, I can turn this into a script.<\/p>\n<pre class=\"lang:ps decode:true \" >#requires -version 3.0\r\n\r\n#comment based help is here\r\n\r\n[cmdletbinding()]\r\n\r\nParam (\r\n[Parameter(Position=0)]\r\n[ValidateScript({Test-Path $_})]\r\n[string]$File = \"$env:localappdata\\Google\\Chrome\\User Data\\Default\\Bookmarks\",\r\n[switch]$Validate\r\n)\r\n\r\nWrite-Verbose -Message \"Starting $($MyInvocation.Mycommand)\"\r\n\r\n#A nested function to enumerate bookmark folders\r\nFunction Get-BookmarkFolder {\r\n[cmdletbinding()]\r\nParam(\r\n[Parameter(Position=0,ValueFromPipeline=$True)]\r\n$Node\r\n)\r\n\r\nProcess {\r\n    \r\n foreach ($child in $node.children) {\r\n   #get parent folder name\r\n   $parent = $node.Name\r\n   if ($child.type -eq 'Folder') {\r\n     Write-Verbose \"Processing $($child.Name)\"\r\n     Get-BookmarkFolder $child\r\n   }\r\n   else {\r\n        $hash= [ordered]@{\r\n          Folder = $parent\r\n          Name = $child.name\r\n          URL = $child.url\r\n          Added = [datetime]::FromFileTime(([double]$child.Date_Added)*10)\r\n          Valid = $Null\r\n          Status = $Null\r\n        }\r\n        If ($Validate) {\r\n          Write-Verbose \"Validating $($child.url)\"\r\n          if ($child.url -match \"^http\") {\r\n            #only test if url starts with http or https\r\n            Try {\r\n              $r = Invoke-WebRequest -Uri $child.url -DisableKeepAlive -UseBasicParsing\r\n              if ($r.statuscode -eq 200) {\r\n                $hash.Valid = $True\r\n              } #if statuscode\r\n              else {\r\n                $hash.valid = $False\r\n              }\r\n              $hash.status = $r.statuscode\r\n              Remove-Variable -Name r -Force\r\n            }\r\n            Catch {\r\n              Write-Warning \"Could not validate $($child.url)\"\r\n              $hash.valid = $False\r\n              $hash.status = $Null\r\n            }\r\n              \r\n            } #if url\r\n              \r\n    } #if validate\r\n        #write custom object\r\n        New-Object -TypeName PSobject -Property $hash\r\n  } #else url\r\n } #foreach\r\n } #process\r\n} #end function\r\n\r\n#convert Google Chrome Bookmark filefrom JSON\r\n$data = Get-Content $file | Out-String | ConvertFrom-Json\r\n\r\n#these should be the top level \"folders\"\r\n$data.roots.bookmark_bar | Get-BookmarkFolder \r\n$data.roots.other | Get-BookmarkFolder \r\n$data.roots.synced | Get-BookmarkFolder\r\n\r\nWrite-Verbose -Message \"Ending $($MyInvocation.Mycommand)\"\r\n<\/pre>\n<p>This script converts the bookmarks file from JSON and creates custom objects for each bookmark using the nested Get-BookMarkFolder function. This processes each child if it is a url. If it is a folder then it passes the folder name recursively to Get-BookmarkFolder. Because validation might be time consuming,  I made it optional with -Validate. I also converted the date_added property into a user-friendly datetime format. The value in the file is a file time, i.e. number of ticks since 1\/1\/1601. Although the actual value needs to be multiplied by 10 to get the correct date time.<\/p>\n<p>When I run the script, without validation I get an object like this for each bookmark.<\/p>\n<p>Folder : Misc<br \/>\nName   : [Release][Alpha0.6] CyanogenMod 9 Touchpad - RootzWiki<br \/>\nURL    : http:\/\/rootzwiki.com\/topic\/15509-releasealpha06-cyanogenmod-9-touchpad\/<br \/>\nAdded  : 8\/15\/2012 10:42:49 PM<br \/>\nValid  :<br \/>\nStatus :<\/p>\n<p>If I validate it will look like this:<\/p>\n<p>Folder : Misc<br \/>\nName   : [Release][Alpha0.6] CyanogenMod 9 Touchpad - RootzWiki<br \/>\nURL    : http:\/\/rootzwiki.com\/topic\/15509-releasealpha06-cyanogenmod-9-touchpad\/<br \/>\nAdded  : 8\/15\/2012 10:42:49 PM<br \/>\nValid  : True<br \/>\nstatus : 200<\/p>\n<p>Bookmarks that fail will show as False. I haven't gotten around to figuring out how to rewrite the bookmarks file, but I would probably end up using ConvertTo-JSON.<\/p>\n<p>The web cmdlets in PowerShell v3 can be a lot of fun to work with. But one word of caution: do NOT try to turn the script in the ISE using -validate. It is possible that Invoke-WebRequest will begin consuming all memory on your computer, unless you make sure the ISE process is completely killed.<\/p>\n<p>I hope you'll download <a href='http:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2012\/11\/Get-ChromeBookmark.txt' target='_blank'>Get-ChromeBookmark<\/a> and let me know what you think.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I was cleaning up and organizing bookmarks in Google Chrome today and decided to find out where they were stored on my computer. I found the Bookmarks file in a local app data folder. Opening it up in Notepad I was pleasantly surprised to discover it is in JSON. Excellent! This gives me an opportunity&#8230;<\/p>\n","protected":false},"author":1,"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,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[359],"tags":[412,410,411,534],"class_list":["post-2591","post","type-post","status-publish","format-standard","hentry","category-powershell-3-0","tag-convertfrom-json","tag-invoke-webrequest","tag-json","tag-powershell"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Friday Fun: Testing Google Chrome Bookmarks with PowerShell &#8226; The Lonely Administrator<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Friday Fun: Testing Google Chrome Bookmarks with PowerShell &#8226; The Lonely Administrator\" \/>\n<meta property=\"og:description\" content=\"I was cleaning up and organizing bookmarks in Google Chrome today and decided to find out where they were stored on my computer. I found the Bookmarks file in a local app data folder. Opening it up in Notepad I was pleasantly surprised to discover it is in JSON. Excellent! This gives me an opportunity...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/\" \/>\n<meta property=\"og:site_name\" content=\"The Lonely Administrator\" \/>\n<meta property=\"article:published_time\" content=\"2012-11-23T18:28:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-11-01T11:54:48+00:00\" \/>\n<meta name=\"author\" content=\"Jeffery Hicks\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@JeffHicks\" \/>\n<meta name=\"twitter:site\" content=\"@JeffHicks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeffery Hicks\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/\"},\"author\":{\"name\":\"Jeffery Hicks\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#\\\/schema\\\/person\\\/d0258030b41f07fd745f4078bdf5b6c9\"},\"headline\":\"Friday Fun: Testing Google Chrome Bookmarks with PowerShell\",\"datePublished\":\"2012-11-23T18:28:29+00:00\",\"dateModified\":\"2013-11-01T11:54:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/\"},\"wordCount\":499,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#\\\/schema\\\/person\\\/d0258030b41f07fd745f4078bdf5b6c9\"},\"keywords\":[\"ConvertFrom-JSON\",\"Invoke-WebRequest\",\"JSON\",\"PowerShell\"],\"articleSection\":[\"Powershell 3.0\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/\",\"url\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/\",\"name\":\"Friday Fun: Testing Google Chrome Bookmarks with PowerShell &#8226; The Lonely Administrator\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#website\"},\"datePublished\":\"2012-11-23T18:28:29+00:00\",\"dateModified\":\"2013-11-01T11:54:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell-3-0\\\/2591\\\/friday-fun-testing-google-chrome-bookmarks-with-powershell\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Powershell 3.0\",\"item\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/category\\\/powershell-3-0\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Friday Fun: Testing Google Chrome Bookmarks with PowerShell\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/\",\"name\":\"The Lonely Administrator\",\"description\":\"Practical Advice for the Automating IT Pro\",\"publisher\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#\\\/schema\\\/person\\\/d0258030b41f07fd745f4078bdf5b6c9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#\\\/schema\\\/person\\\/d0258030b41f07fd745f4078bdf5b6c9\",\"name\":\"Jeffery Hicks\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg\",\"caption\":\"Jeffery Hicks\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Friday Fun: Testing Google Chrome Bookmarks with PowerShell &#8226; The Lonely Administrator","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/","og_locale":"en_US","og_type":"article","og_title":"Friday Fun: Testing Google Chrome Bookmarks with PowerShell &#8226; The Lonely Administrator","og_description":"I was cleaning up and organizing bookmarks in Google Chrome today and decided to find out where they were stored on my computer. I found the Bookmarks file in a local app data folder. Opening it up in Notepad I was pleasantly surprised to discover it is in JSON. Excellent! This gives me an opportunity...","og_url":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/","og_site_name":"The Lonely Administrator","article_published_time":"2012-11-23T18:28:29+00:00","article_modified_time":"2013-11-01T11:54:48+00:00","author":"Jeffery Hicks","twitter_card":"summary_large_image","twitter_creator":"@JeffHicks","twitter_site":"@JeffHicks","twitter_misc":{"Written by":"Jeffery Hicks","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/#article","isPartOf":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/"},"author":{"name":"Jeffery Hicks","@id":"https:\/\/jdhitsolutions.com\/blog\/#\/schema\/person\/d0258030b41f07fd745f4078bdf5b6c9"},"headline":"Friday Fun: Testing Google Chrome Bookmarks with PowerShell","datePublished":"2012-11-23T18:28:29+00:00","dateModified":"2013-11-01T11:54:48+00:00","mainEntityOfPage":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/"},"wordCount":499,"commentCount":5,"publisher":{"@id":"https:\/\/jdhitsolutions.com\/blog\/#\/schema\/person\/d0258030b41f07fd745f4078bdf5b6c9"},"keywords":["ConvertFrom-JSON","Invoke-WebRequest","JSON","PowerShell"],"articleSection":["Powershell 3.0"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/","url":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/","name":"Friday Fun: Testing Google Chrome Bookmarks with PowerShell &#8226; The Lonely Administrator","isPartOf":{"@id":"https:\/\/jdhitsolutions.com\/blog\/#website"},"datePublished":"2012-11-23T18:28:29+00:00","dateModified":"2013-11-01T11:54:48+00:00","breadcrumb":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell-3-0\/2591\/friday-fun-testing-google-chrome-bookmarks-with-powershell\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Powershell 3.0","item":"https:\/\/jdhitsolutions.com\/blog\/category\/powershell-3-0\/"},{"@type":"ListItem","position":2,"name":"Friday Fun: Testing Google Chrome Bookmarks with PowerShell"}]},{"@type":"WebSite","@id":"https:\/\/jdhitsolutions.com\/blog\/#website","url":"https:\/\/jdhitsolutions.com\/blog\/","name":"The Lonely Administrator","description":"Practical Advice for the Automating IT Pro","publisher":{"@id":"https:\/\/jdhitsolutions.com\/blog\/#\/schema\/person\/d0258030b41f07fd745f4078bdf5b6c9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jdhitsolutions.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/jdhitsolutions.com\/blog\/#\/schema\/person\/d0258030b41f07fd745f4078bdf5b6c9","name":"Jeffery Hicks","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg","caption":"Jeffery Hicks"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/832ae5d438fdcfc1420d720cd1991307927de8a0b12f2342e81c30f773e21098?s=96&d=wavatar&r=pg"}}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":5396,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/5396\/storing-powershell-credentials-in-json\/","url_meta":{"origin":2591,"position":0},"title":"Storing PowerShell Credentials in JSON","author":"Jeffery Hicks","date":"January 23, 2017","format":false,"excerpt":"Sometimes I do things in PowerShell just to see what happens. This is a great way to learn about new cmdlets and techniques. Sometimes these experiments lead to useful results. Other times they may end up as teaching devices. Of\u00a0 course the result could serve both purposes and you may\u2026","rel":"","context":"In &quot;PowerShell&quot;","block_context":{"text":"PowerShell","link":"https:\/\/jdhitsolutions.com\/blog\/category\/powershell\/"},"img":{"alt_text":"image","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2017\/01\/image_thumb-9.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2017\/01\/image_thumb-9.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2017\/01\/image_thumb-9.png?resize=525%2C300 1.5x"},"classes":[]},{"id":6612,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/6612\/more-fun-with-docker-containers-and-powershell\/","url_meta":{"origin":2591,"position":1},"title":"More Fun with Docker Containers and PowerShell","author":"Jeffery Hicks","date":"March 29, 2019","format":false,"excerpt":"A few days ago I shared some experiences of working with Docker containers and PowerShell. As I continue to learn Docker, I am also learning how to manage it with PowerShell. The Docker command line tools are fine but I think they are even better when drizzled with a nice\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/jdhitsolutions.com\/blog\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/03\/image_thumb-20.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/03\/image_thumb-20.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/03\/image_thumb-20.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/03\/image_thumb-20.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":5121,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/5121\/friday-fun-find-a-git-tip-with-powershell\/","url_meta":{"origin":2591,"position":2},"title":"Friday Fun: Find a Git Tip with PowerShell","author":"Jeffery Hicks","date":"June 24, 2016","format":false,"excerpt":"Recently I published a PowerShell function that I use to display a random Git Tip of the Day. The function relies on my clone of the Git-Tips project on GitHub. I've been keeping tabs on this project and a question was posed about creating a command line utility to search\u2026","rel":"","context":"In &quot;Friday Fun&quot;","block_context":{"text":"Friday Fun","link":"https:\/\/jdhitsolutions.com\/blog\/category\/friday-fun\/"},"img":{"alt_text":"finding a git tip with PowerShell","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2016\/06\/image_thumb-20.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2016\/06\/image_thumb-20.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2016\/06\/image_thumb-20.png?resize=525%2C300 1.5x"},"classes":[]},{"id":7003,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/7003\/friday-fun-getting-ahead-with-windows-terminal\/","url_meta":{"origin":2591,"position":3},"title":"Friday Fun: Getting Ahead with Windows Terminal","author":"Jeffery Hicks","date":"November 29, 2019","format":false,"excerpt":"I've been using the new Windows Terminal from Microsoft for quite while. In fact, it has become my standard command line interface for PowerShell and more. I'm not sure at what point some of these features were added, but I can now set a background image and specify where to\u2026","rel":"","context":"In &quot;Friday Fun&quot;","block_context":{"text":"Friday Fun","link":"https:\/\/jdhitsolutions.com\/blog\/category\/friday-fun\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/11\/image_thumb-23.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/11\/image_thumb-23.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/11\/image_thumb-23.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/11\/image_thumb-23.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":6629,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/6629\/extending-powershell-and-docker-containers\/","url_meta":{"origin":2591,"position":4},"title":"Extending PowerShell and Docker Containers","author":"Jeffery Hicks","date":"April 2, 2019","format":false,"excerpt":"I've been continuing to tinker with my PowerShell command for getting information about Docker containers. The Docker CLI is fine, but it is very difficult to work with the output or do much with it. That's why I prefer to have objects in a PowerShell pipeline. One of the Docker\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/jdhitsolutions.com\/blog\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/04\/image_thumb-6.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/04\/image_thumb-6.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/04\/image_thumb-6.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2019\/04\/image_thumb-6.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":7424,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/7424\/powershell-helper-scripts-for-windows-terminal\/","url_meta":{"origin":2591,"position":5},"title":"PowerShell Helper Scripts for Windows Terminal","author":"Jeffery Hicks","date":"May 1, 2020","format":false,"excerpt":"I've spent some time over the last few days getting my Windows Terminal setup in order. Hopefull you saw my recent post about backing up my settings.json file. I've also put together a few other simple PowerShell scripts that I use to make Windows Terminal even easier to use and\u2026","rel":"","context":"In &quot;PowerShell&quot;","block_context":{"text":"PowerShell","link":"https:\/\/jdhitsolutions.com\/blog\/category\/powershell\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/05\/wtprocess.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/05\/wtprocess.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/05\/wtprocess.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/05\/wtprocess.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/05\/wtprocess.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/05\/wtprocess.png?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/2591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=2591"}],"version-history":[{"count":0,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/2591\/revisions"}],"wp:attachment":[{"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=2591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=2591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=2591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}