{"id":8960,"date":"2022-03-16T12:26:29","date_gmt":"2022-03-16T16:26:29","guid":{"rendered":"https:\/\/jdhitsolutions.com\/blog\/?p=8960"},"modified":"2022-03-16T12:26:33","modified_gmt":"2022-03-16T16:26:33","slug":"introducing-psprojectstatus","status":"publish","type":"post","link":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/","title":{"rendered":"Introducing PSProjectStatus"},"content":{"rendered":"\n<p>I write a lot of PowerShell modules. And probably like you, I am working on more than one project at a time. I was finding it difficult to keep track of what I was working on and what I might be neglecting. So I turned to PowerShell and created a tool that I use to keep on top of my projects. The PowerShell module is called PSProjectStatus and you can install it from the PowerShell Gallery. You can find the project on <a href=\"https:\/\/github.com\/jdhitsolutions\/PSProjectStatus\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>, but I thought I'd provide an introduction here.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Class-Based<\/h2>\n\n\n\n<p>The module is built around a PowerShell class that defines a PSProject object.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"powershell\" class=\"language-powershell\">Class PSProject {\n    [string]$Name = (Split-Path (Get-Location).path -Leaf)\n    [string]$Path = (Convert-Path (Get-Location).path)\n    [datetime]$LastUpdate = (Get-Date)\n    [string[]]$Tasks\n    [PSProjectStatus]$Status = \"Development\"\n    [string]$GitBranch\n    [string]$UpdateUser = \"$([system.environment]::UserDomainName)\\$([System.Environment]::Username)\"\n\n    [void]Save() {\n        $json = Join-Path -Path $this.path -ChildPath psproject.json\n        $this | Select-Object -Property * -exclude Age | ConvertTo-Json | Out-File $json\n    }\n}<\/code><\/pre>\n\n\n\n<p>The data to create the class is stored in a JSON file, psproject.json, which is stored in the module's root directory. The PSProjectStatus module has commands to manage this object and the JSON file.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a Status<\/h2>\n\n\n\n<p>To create a new status, change to the root of your module and run <a href=\"https:\/\/github.com\/jdhitsolutions\/PSProjectStatus\/blob\/main\/docs\/New-PSProjectStatus.md\" target=\"_blank\" rel=\"noreferrer noopener\">New-PSProjectStatus<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"193\" src=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1024x193.png\" alt=\"Creating a psproject status\" class=\"wp-image-8961\" srcset=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1024x193.png 1024w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-300x56.png 300w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-768x144.png 768w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1536x289.png 1536w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-2048x385.png 2048w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-850x160.png 850w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>The Status property is based on an enumeration. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"powershell\" class=\"language-powershell\">enum PSProjectStatus {\n    Development\n    Updating\n    Stable\n    AlphaTesting\n    BetaTesting\n    ReleaseCandidate\n    Patching\n    UnitTesting\n    AcceptanceTesting\n    Other\n}<\/code><\/pre>\n\n\n\n<p>The default is Development. I've tried to add enough values to accommodate almost any situation. When you create a new PSProject status, information is written to a JSON file.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"355\" src=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json-1024x355.png\" alt=\"PSProjectStatus JSON\" class=\"wp-image-8962\" srcset=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json-1024x355.png 1024w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json-300x104.png 300w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json-768x266.png 768w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json-1536x532.png 1536w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json-850x295.png 850w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psproject-json.png 1734w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>If a git branch is detected, it will be included.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Updating a Status<\/h2>\n\n\n\n<p>To update a status, use the <a href=\"https:\/\/github.com\/jdhitsolutions\/PSProjectStatus\/blob\/main\/docs\/Set-PSProjectStatus.md\" target=\"_blank\" rel=\"noreferrer noopener\">Set-PSProjectStatus<\/a> command.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"200\" src=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-1024x200.png\" alt=\"set a psproject status\" class=\"wp-image-8963\" srcset=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-1024x200.png 1024w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-300x59.png 300w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-768x150.png 768w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-1536x300.png 1536w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-2048x400.png 2048w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/set-psprojectstatus-850x166.png 850w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>You can specify  comma-separated list of tasks. I tend to keep them high-level and broad. If you want to add a task, use the -Concatentate parameter. Currently, there's no way to remove a task other than manually editing the JSON file. If you have your project open in VSCode, that's not too difficult to do. You can always manually edit the file. If you need to update the LastUpdate value, run <strong>Get-Date -format o | Set-Clipboard<\/strong> and paste the value into the file.<\/p>\n\n\n\n<p>The <strong>Age<\/strong> property is a ScriptProperty added by extending the PSProject type.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Getting a Status<\/h2>\n\n\n\n<p>Normally, you will run <a href=\"https:\/\/github.com\/jdhitsolutions\/PSProjectStatus\/blob\/main\/docs\/Get-PSProjectStatus.md\" target=\"_blank\" rel=\"noreferrer noopener\">Get-PSProjectStatus<\/a> from the module root. The default output if a formatted table. This is the output you see when creating or setting a status. The module includes a list view.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"276\" src=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list-1024x276.png\" alt=\"psproject status as list\" class=\"wp-image-8964\" srcset=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list-1024x276.png 1024w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list-300x81.png 300w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list-768x207.png 768w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list-1536x415.png 1536w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list-850x229.png 850w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/get-psprojectstatus-list.png 1882w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>The list makes it easier to view tasks.<\/p>\n\n\n\n<p>To manage everything on my plate, I can use this module in a PowerShell 7 script file.<\/p>\n\n\n\n<pre title=\"Manage-PSProject.ps1\" class=\"wp-block-code\"><code lang=\"powershell\" class=\"language-powershell\">#requires -version 7.2\n#requires -module Microsoft.PowerShell.ConsoleGuiTools\n\n#open a project using the PSProject status\n\nImport-Module PSProjectStatus -Force\n\n#get all projects\n$all = Get-ChildItem -Path C:\\Scripts -Directory | Get-PSProjectStatus -WarningAction SilentlyContinue\n\n#display the projects in Out-ConsoleGridview and open the selected one in VS Code\n$all | Sort-Object Status, LastUpdate |\nSelect-Object Path, Status, @{Name = \"Tasks\"; Expression = { $_.Tasks -join ',' } },\nGitbranch, LastUpdate |\nOut-ConsoleGridView -Title \"PSProject Management\" -OutputMode Single |\nForEach-Object { code $_.path }\n<\/code><\/pre>\n\n\n\n<p>The script searches C:\\Scripts for sub-folders with a psproject.json and displays the projects using Out-ConsoleGridview. From here, I can select a single module and open it in VS Code.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-1024x558.png\" alt=\"manage psproject\" class=\"wp-image-8965\" srcset=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-1024x558.png 1024w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-300x164.png 300w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-768x419.png 768w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-1536x837.png 1536w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-2048x1117.png 2048w, https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/manage-psproject-850x463.png 850w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Try It<\/h2>\n\n\n\n<p>I hope you'll install the module and give it a spin. I'd like to know what you think and how it works for you. What would add value? I already have ideas for enhancements, but I'd live to hear what's on your mind. You are invited to use the repository's <a href=\"https:\/\/github.com\/jdhitsolutions\/PSProjectStatus\/discussions\" target=\"_blank\" rel=\"noreferrer noopener\">Discussions<\/a> section.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I write a lot of PowerShell modules. And probably like you, I am working on more than one project at a time. I was finding it difficult to keep track of what I was working on and what I might be neglecting. So I turned to PowerShell and created a tool that I use to&#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":"New on the blog: A #PowerShell module for managing and tracking project status.","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,8],"tags":[224,221,534,540],"class_list":["post-8960","post","type-post","status-publish","format-standard","hentry","category-powershell","category-scripting","tag-function","tag-module","tag-powershell","tag-scripting"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Introducing PSProjectStatus &#8226; The Lonely Administrator<\/title>\n<meta name=\"description\" content=\"I&#039;m introducing a new PowerShell module that you can use to manage your scripting projects. These tools make it easier to keep up-to-date.\" \/>\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\/8960\/introducing-psprojectstatus\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing PSProjectStatus &#8226; The Lonely Administrator\" \/>\n<meta property=\"og:description\" content=\"I&#039;m introducing a new PowerShell module that you can use to manage your scripting projects. These tools make it easier to keep up-to-date.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/\" \/>\n<meta property=\"og:site_name\" content=\"The Lonely Administrator\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-16T16:26:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-16T16:26:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1024x193.png\" \/>\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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/\"},\"author\":{\"name\":\"Jeffery Hicks\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#\\\/schema\\\/person\\\/d0258030b41f07fd745f4078bdf5b6c9\"},\"headline\":\"Introducing PSProjectStatus\",\"datePublished\":\"2022-03-16T16:26:29+00:00\",\"dateModified\":\"2022-03-16T16:26:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/\"},\"wordCount\":468,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#\\\/schema\\\/person\\\/d0258030b41f07fd745f4078bdf5b6c9\"},\"image\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/new-psprojectstatus-1024x193.png\",\"keywords\":[\"Function\",\"module\",\"PowerShell\",\"Scripting\"],\"articleSection\":[\"PowerShell\",\"Scripting\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/\",\"url\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/\",\"name\":\"Introducing PSProjectStatus &#8226; The Lonely Administrator\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/new-psprojectstatus-1024x193.png\",\"datePublished\":\"2022-03-16T16:26:29+00:00\",\"dateModified\":\"2022-03-16T16:26:33+00:00\",\"description\":\"I'm introducing a new PowerShell module that you can use to manage your scripting projects. These tools make it easier to keep up-to-date.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#primaryimage\",\"url\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/new-psprojectstatus.png\",\"contentUrl\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/new-psprojectstatus.png\",\"width\":2824,\"height\":531},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/powershell\\\/8960\\\/introducing-psprojectstatus\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"PowerShell\",\"item\":\"https:\\\/\\\/jdhitsolutions.com\\\/blog\\\/category\\\/powershell\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing PSProjectStatus\"}]},{\"@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":"Introducing PSProjectStatus &#8226; The Lonely Administrator","description":"I'm introducing a new PowerShell module that you can use to manage your scripting projects. These tools make it easier to keep up-to-date.","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\/8960\/introducing-psprojectstatus\/","og_locale":"en_US","og_type":"article","og_title":"Introducing PSProjectStatus &#8226; The Lonely Administrator","og_description":"I'm introducing a new PowerShell module that you can use to manage your scripting projects. These tools make it easier to keep up-to-date.","og_url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/","og_site_name":"The Lonely Administrator","article_published_time":"2022-03-16T16:26:29+00:00","article_modified_time":"2022-03-16T16:26:33+00:00","og_image":[{"url":"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1024x193.png","type":"","width":"","height":""}],"author":"Jeffery Hicks","twitter_card":"summary_large_image","twitter_creator":"@JeffHicks","twitter_site":"@JeffHicks","twitter_misc":{"Written by":"Jeffery Hicks","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#article","isPartOf":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/"},"author":{"name":"Jeffery Hicks","@id":"https:\/\/jdhitsolutions.com\/blog\/#\/schema\/person\/d0258030b41f07fd745f4078bdf5b6c9"},"headline":"Introducing PSProjectStatus","datePublished":"2022-03-16T16:26:29+00:00","dateModified":"2022-03-16T16:26:33+00:00","mainEntityOfPage":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/"},"wordCount":468,"commentCount":2,"publisher":{"@id":"https:\/\/jdhitsolutions.com\/blog\/#\/schema\/person\/d0258030b41f07fd745f4078bdf5b6c9"},"image":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#primaryimage"},"thumbnailUrl":"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1024x193.png","keywords":["Function","module","PowerShell","Scripting"],"articleSection":["PowerShell","Scripting"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/","url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/","name":"Introducing PSProjectStatus &#8226; The Lonely Administrator","isPartOf":{"@id":"https:\/\/jdhitsolutions.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#primaryimage"},"image":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#primaryimage"},"thumbnailUrl":"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus-1024x193.png","datePublished":"2022-03-16T16:26:29+00:00","dateModified":"2022-03-16T16:26:33+00:00","description":"I'm introducing a new PowerShell module that you can use to manage your scripting projects. These tools make it easier to keep up-to-date.","breadcrumb":{"@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#primaryimage","url":"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus.png","contentUrl":"https:\/\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2022\/03\/new-psprojectstatus.png","width":2824,"height":531},{"@type":"BreadcrumbList","@id":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8960\/introducing-psprojectstatus\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"PowerShell","item":"https:\/\/jdhitsolutions.com\/blog\/category\/powershell\/"},{"@type":"ListItem","position":2,"name":"Introducing PSProjectStatus"}]},{"@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":8741,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8741\/building-a-powershell-module-inception-style\/","url_meta":{"origin":8960,"position":0},"title":"Building a PowerShell Module Inception-Style","author":"Jeffery Hicks","date":"December 17, 2021","format":false,"excerpt":"Over the course of the last week or so, I've been sharing PowerShell functions and scripts for working with PowerShell functions and scripts. I showed PowerShell functions to export functions to a script file and code to convert scripts to functions It has all been very Inception-like. To wrap this\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\/2021\/12\/psinception.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":8585,"url":"https:\/\/jdhitsolutions.com\/blog\/scripting\/8585\/i-need-a-psdrive-now\/","url_meta":{"origin":8960,"position":1},"title":"I Need a PSDrive Now!","author":"Jeffery Hicks","date":"September 24, 2021","format":false,"excerpt":"I hope you've been enjoying the last few posts on working with PSDrives. To round out the set, I thought I'd remind you of a command in the PSScriptTools module that I use often, especially when teaching a live class or presenting at a conference. As you've seen, I use\u2026","rel":"","context":"In &quot;Scripting&quot;","block_context":{"text":"Scripting","link":"https:\/\/jdhitsolutions.com\/blog\/category\/scripting\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/09\/npsd-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/09\/npsd-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/09\/npsd-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/09\/npsd-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":7559,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/7559\/an-expanded-powershell-scripting-inventory-tool\/","url_meta":{"origin":8960,"position":2},"title":"An Expanded PowerShell Scripting Inventory Tool","author":"Jeffery Hicks","date":"June 19, 2020","format":false,"excerpt":"The other day I shared my code that I worked up to solve an Iron Scripter PowerShell challenge. One of the shortcomings was that I didn't address a challenge to include a property that would indicate what file was using a given command. I also felt I could do better\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\/06\/get-psscriptinventory.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/06\/get-psscriptinventory.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/06\/get-psscriptinventory.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/06\/get-psscriptinventory.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/06\/get-psscriptinventory.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2020\/06\/get-psscriptinventory.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":8724,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8724\/discovering-aliases-with-the-powershell-ast\/","url_meta":{"origin":8960,"position":3},"title":"Discovering Aliases with the PowerShell AST","author":"Jeffery Hicks","date":"December 15, 2021","format":false,"excerpt":"I've been working on a new PowerShell module that incorporates code from a few of my recent posts on converting PowerShell scripts and functions to files. I even whipped up a script, think of it as a meta-script, to create the module using the commands that I am adding to\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\/2021\/12\/find-alias-string.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/12\/find-alias-string.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/12\/find-alias-string.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/12\/find-alias-string.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":7992,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/7992\/answering-the-cim-directory-challenge\/","url_meta":{"origin":8960,"position":4},"title":"Answering the CIM Directory Challenge","author":"Jeffery Hicks","date":"January 8, 2021","format":false,"excerpt":"The last Iron Scripter challenge of 2020 was a big one. If you didn't get a chance to work on it, see what you can come up with then come back to see my approach. As with many of the challenges, the goal isn't to produce a production-ready PowerShell tool,\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\/2021\/01\/win32_directory.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/01\/win32_directory.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/01\/win32_directory.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/01\/win32_directory.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/01\/win32_directory.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/01\/win32_directory.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":8693,"url":"https:\/\/jdhitsolutions.com\/blog\/powershell\/8693\/exporting-powershell-functions-to-files\/","url_meta":{"origin":8960,"position":5},"title":"Exporting PowerShell Functions to Files","author":"Jeffery Hicks","date":"December 3, 2021","format":false,"excerpt":"When I write a PowerShell module, it typically includes more than one export function. Where you store your module functions is a great discussion topic and I don't think there is necessarily one best practice for everyone. I think it might depend on the number and complexity of the functions.\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\/2021\/12\/export-function3.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/12\/export-function3.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/12\/export-function3.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/jdhitsolutions.com\/blog\/wp-content\/uploads\/2021\/12\/export-function3.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/8960","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=8960"}],"version-history":[{"count":0,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/8960\/revisions"}],"wp:attachment":[{"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=8960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=8960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jdhitsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=8960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}