{"id":12941,"date":"2011-08-21T00:01:00","date_gmt":"2011-08-21T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2011\/08\/21\/clean-up-your-powershell-environment-by-tracking-variable-use\/"},"modified":"2011-08-21T00:01:00","modified_gmt":"2011-08-21T00:01:00","slug":"clean-up-your-powershell-environment-by-tracking-variable-use","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/clean-up-your-powershell-environment-by-tracking-variable-use\/","title":{"rendered":"Clean Up Your PowerShell Environment by Tracking Variable Use"},"content":{"rendered":"<p><strong>Summary<\/strong>: Guest Blogger Ingo Karstein shares a Windows PowerShell function to track and remove variables from your environment.\n&nbsp;\nMicrosoft Scripting Guy Ed Wilson here. Today, we have a guest blog article written by Ingo Karstein. He has a really clever way to clean up your Windows PowerShell environment. I will let Ingo tell you a bit about himself.\n&nbsp;\nThis is Ingo Karstein. I&rsquo;m a senior consultant for SharePoint, Windows PowerShell, and custom development. For about the last year, I have written a blog (<a href=\"http:\/\/ikarstein.wordpress.com\/\">http:\/\/ikarstein.wordpress.com<\/a>) where I discuss problems, ideas, and solutions related to these topics.&nbsp;\nToday I want to show you how to clean up variables in Windows PowerShell. Let&rsquo;s say you are an administrator in an organization and you have written a Windows PowerShell profile that is loaded on every Windows PowerShell session startup. This profile is used for every user that may start Windows PowerShell. In this script you may do lot of stuff: read SharePoint lists, manipulate Active Directory Domain Services, read WMI, and trace the Event log. You have used dozens of Windows PowerShell variables.\nFinally, you may want to clean up your profile script so that users cannot access the profile script data stored in these variables. Variables in Windows PowerShell are objects provided by the Windows PowerShell provider:<\/p>\n<p style=\"padding-left: 30px\">PS&gt; get-psprovider<\/p>\n<p style=\"padding-left: 30px\"><span style=\"text-decoration: underline\">Name<\/span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"text-decoration: underline\">Capabilities<\/span>&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;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"text-decoration: underline\">Drives<\/span><\/p>\n<p style=\"padding-left: 30px\">WSMan &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Credentials&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;&nbsp;&nbsp;&nbsp;&nbsp; {WSMan}<\/p>\n<p style=\"padding-left: 30px\">Alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShouldProcess&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {Alias}<\/p>\n<p style=\"padding-left: 30px\">Environment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShouldProcess&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {Env}<\/p>\n<p style=\"padding-left: 30px\">FileSystem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Filter, ShouldProcess&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {C, Z, G}<\/p>\n<p style=\"padding-left: 30px\">Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShouldProcess&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {Function}<\/p>\n<p style=\"padding-left: 30px\">Registry &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShouldProcess, Transactions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {HKLM, HKCU}<\/p>\n<p style=\"padding-left: 30px\">Variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShouldProcess&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {Variable}<\/p>\n<p style=\"padding-left: 30px\">Certificate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShouldProcess&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {cert}<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nWindows PowerShell providers are interfaces that connect hierarchical storage to Windows PowerShell, such as file system, Windows registry, Active Directory Domain Services, and Windows certificate store. The storage types have container objects such as folders in the file system and leaf objects such as files in the file system.\nThere are some &ldquo;flat&rdquo; storages connected to Windows PowerShell with Windows PowerShell providers: <b>Variable<\/b>, <b>Function<\/b>, <b>Environment<\/b>, and <b>Alias<\/b>. These storages do not have containers, only leafs.\nThe <b>Variable<\/b> Windows PowerShell provider represents the variables used in the windows PowerShell session. Let&rsquo;s try it:<\/p>\n<p style=\"padding-left: 30px\">PS&gt; get-item Variable:*<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\"><span style=\"text-decoration: underline\">Name<\/span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"text-decoration: underline\">Value<\/span><\/p>\n<p style=\"padding-left: 30px\">null<\/p>\n<p style=\"padding-left: 30px\">false&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;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; False<\/p>\n<p style=\"padding-left: 30px\">true&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;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; True<\/p>\n<p style=\"padding-left: 30px\">MaximumErrorCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 256<\/p>\n<p style=\"padding-left: 30px\">MaximumVariableCount &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4096<\/p>\n<p style=\"padding-left: 30px\">MaximumFunctionCount 4096<\/p>\n<p style=\"padding-left: 30px\">MaximumAliasCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4096<\/p>\n<p style=\"padding-left: 30px\">MaximumDriveCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4096<\/p>\n<p style=\"padding-left: 30px\">Error&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;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}<\/p>\n<p style=\"padding-left: 30px\">PWD&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;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C:UsersUser2<\/p>\n<p style=\"padding-left: 30px\">?&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; True<\/p>\n<p style=\"padding-left: 30px\">MaximumHistoryCount&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nYou can see a list of objects. These objects have at least two properties: <b>Name<\/b> and <b>Value<\/b>. <b>Name<\/b> is the name of the variable. <b>Value<\/b> is its value. But there are more properties (you can see here that I use a German localized Windows PowerShell session):<\/p>\n<p style=\"padding-left: 30px\">PS&gt; get-item variable:PSCulture | fl<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">PSPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.PowerShell.CoreVariable::PSCulture<\/p>\n<p style=\"padding-left: 30px\">PSDrive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Variable<\/p>\n<p style=\"padding-left: 30px\">PSProvider&nbsp;&nbsp;&nbsp; : Microsoft.PowerShell.CoreVariable<\/p>\n<p style=\"padding-left: 30px\">PSIsContainer : False<\/p>\n<p style=\"padding-left: 30px\">Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : de-DE<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : PSCulture<\/p>\n<p style=\"padding-left: 30px\">Description&nbsp;&nbsp; : Die Kultur der aktuellen Windows PowerShell-Sitzung.<\/p>\n<p style=\"padding-left: 30px\">Visibility&nbsp;&nbsp;&nbsp; : Public<\/p>\n<p style=\"padding-left: 30px\">Module&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p style=\"padding-left: 30px\">ModuleName&nbsp;&nbsp;&nbsp; :<\/p>\n<p style=\"padding-left: 30px\">Options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ReadOnly, AllScope<\/p>\n<p style=\"padding-left: 30px\">Attributes&nbsp;&nbsp;&nbsp; : {}<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nIf you try the <b>Get-Member<\/b> cmdlet, you&rsquo;ll figure out that the type of such a variable object is <b>System.Management.Automation.PSCultureVariable<\/b>.<\/p>\n<p style=\"padding-left: 30px\">PS&gt; get-item variable:PSCulture | gm<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nYou can use the <b>Variable<\/b> Windows PowerShell provider as you would any other provider, such as the file system provider. You can add new items to the variable storage:<\/p>\n<p style=\"padding-left: 30px\">PS&gt; New-Item -Path &#8220;variable:My New Variable&#8221; -Value &#8220;Hey, Scripting Guy!&#8221;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\"><span style=\"text-decoration: underline\">Name<\/span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"text-decoration: underline\">Value<\/span><\/p>\n<p style=\"padding-left: 30px\">My New Variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hey, Scripting Guy!<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nYou can check for their existence:<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; test-path -Path &#8220;variable:My New Variable&#8221;<\/p>\n<p style=\"padding-left: 30px\">True<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nYou can get their value (remember, it&rsquo;s an object that you get with <b>Get-Item<\/b>):<\/p>\n<p style=\"padding-left: 30px\">PS&gt; (get-item -Path &#8220;variable:My New Variable&#8221;).Value<\/p>\n<p style=\"padding-left: 30px\">Hey, Scripting Guy!<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nOf course, you can access them the &ldquo;common way&rdquo;:<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; ${My New Variable}<\/p>\n<p style=\"padding-left: 30px\">Hey, Scripting Guy!<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\n(You need to use braces because the name of the variable contains spaces.)\nDo you know that you can delete variables in Windows PowerShell? Yes, you can remove them:<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; remove-item -Path &#8220;variable:My New Variable&#8221;\n&nbsp;\nAfter that, the variable does not exist anymore!<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; test-path -Path &#8220;variable:My New Variable&#8221;<\/p>\n<p style=\"padding-left: 30px\">False\n&nbsp;\nIn this way, you can manipulate every Windows PowerShell variable, as well as the variables created &ldquo;normally&rdquo;:<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; $thatsMe = &#8220;Ingo&#8221;<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; get-item variable:thatsMe<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\"><span style=\"text-decoration: underline\">Name<\/span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"text-decoration: underline\">Value<\/span><\/p>\n<p style=\"padding-left: 30px\">thatsMe &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ingo\n&nbsp;\nLet&rsquo;s return to the scenario of the beginning of this article: you want to clean up your Windows PowerShell session. Now you can create a script that acts in this way:<\/p>\n<ol>\n<li>At start of the profile script, read and store all variable names that exist.<\/li>\n<li>Execute the script.<\/li>\n<li>Remove all variables that did not exist at the script&rsquo;s start time.<\/li>\n<\/ol>\n<p>Here it is:<\/p>\n<p style=\"padding-left: 30px\"># All variables that exists at this moment will also exist<\/p>\n<p style=\"padding-left: 30px\"># after executing &#8220;Cleanup-Variables&#8221;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">###################################################################<\/p>\n<p style=\"padding-left: 30px\"># stores all existing variable names in the variable<\/p>\n<p style=\"padding-left: 30px\"># &#8220;startupVariables&#8221;. This variable itself will be<\/p>\n<p style=\"padding-left: 30px\"># removed too.<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">$startupVariables=&#8221;&#8221;<\/p>\n<p style=\"padding-left: 30px\">new-variable -force -name startupVariables -value ( Get-Variable |<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp; % { $_.Name } )<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">function Cleanup-Variables {<\/p>\n<p style=\"padding-left: 30px\">&nbsp; Get-Variable |<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; Where-Object { $startupVariables -notcontains $_.Name } |<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; % { Remove-Variable -Name &#8220;$($_.Name)&#8221; -Force -Scope &#8220;global&#8221; }<\/p>\n<p style=\"padding-left: 30px\">}<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">####################################################################<\/p>\n<p style=\"padding-left: 30px\"># Place your profile scripts in here<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">#Sample: &#8211;&gt;<\/p>\n<p style=\"padding-left: 30px\">$myVariable = (Get-Process | select -first 5)<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">write-host &#8220;Here the variable exists&#8221;<\/p>\n<p style=\"padding-left: 30px\">$myVariable<\/p>\n<p style=\"padding-left: 30px\">#&lt;&#8211;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">####################################################################<\/p>\n<p style=\"padding-left: 30px\"># Now all variables created since execution of line 8 will<\/p>\n<p style=\"padding-left: 30px\"># be removed.<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Cleanup-Variables<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">####################################################################<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">#Sample: &#8211;&gt;<\/p>\n<p style=\"padding-left: 30px\">write-host &#8220;Now the variable is unknown&#8221;<\/p>\n<p style=\"padding-left: 30px\">$myVariable<\/p>\n<p style=\"padding-left: 30px\">#&lt;&#8211;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nThere are more cmdlets specific to Windows PowerShell variables:<\/p>\n<p style=\"padding-left: 30px\">PS C:UsersUser2&gt; get-command -noun variable<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\"><span style=\"text-decoration: underline\">CommandType&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name<\/span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"text-decoration: underline\">Definition<\/span><\/p>\n<p style=\"padding-left: 30px\">Cmdlet&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Clear-Variable&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Clear-Variable [-Name] &lt;Stri&#8230;<\/p>\n<p style=\"padding-left: 30px\">Cmdlet&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get-Variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get-Variable [[-Name] &lt;Strin&#8230;<\/p>\n<p style=\"padding-left: 30px\">Cmdlet&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; New-Variable&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; New-Variable [-Name] &lt;String&#8230;<\/p>\n<p style=\"padding-left: 30px\">Cmdlet&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Variable [-Name] &lt;Str&#8230;<\/p>\n<p style=\"padding-left: 30px\">Cmdlet&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set-Variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set-Variable [-Name] &lt;String&#8230;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;\nThank you for your attention.\n&nbsp;\nThank you, Ingo, for taking the time to share your function with us today.\nI invite you to follow me on <a href=\"http:\/\/bit.ly\/scriptingguystwitter\" target=\"_blank\">Twitter<\/a> and <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\">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.\n<b>Ed Wilson, Microsoft Scripting Guy<\/b>\n&nbsp;\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Guest Blogger Ingo Karstein shares a Windows PowerShell function to track and remove variables from your environment. &nbsp; Microsoft Scripting Guy Ed Wilson here. Today, we have a guest blog article written by Ingo Karstein. He has a really clever way to clean up your Windows PowerShell environment. I will let Ingo tell you [&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":[56,274,2,3,4,45],"class_list":["post-12941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-guest-blogger","tag-ingo-karstein","tag-running","tag-scripting-guy","tag-scripting-techniques","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Summary: Guest Blogger Ingo Karstein shares a Windows PowerShell function to track and remove variables from your environment. &nbsp; Microsoft Scripting Guy Ed Wilson here. Today, we have a guest blog article written by Ingo Karstein. He has a really clever way to clean up your Windows PowerShell environment. I will let Ingo tell you [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/12941","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=12941"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/12941\/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=12941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=12941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=12941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}