<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>PowerShell on the crosseroads</title>
    <link>https://www.thecrosseroads.net/categories/powershell/</link>
    <description>Recent content in PowerShell on the crosseroads</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 21 Mar 2012 20:02:00 -0400</lastBuildDate><atom:link href="https://www.thecrosseroads.net/categories/powershell/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Basic Network Configuration with Windows 8</title>
      <link>https://www.thecrosseroads.net/archive/2012/03/basic-network-configuration-with-windows-8/</link>
      <pubDate>Wed, 21 Mar 2012 20:02:00 -0400</pubDate>
      
      <guid>https://www.thecrosseroads.net/archive/2012/03/basic-network-configuration-with-windows-8/</guid>
      <description>&lt;p&gt;With Windows Server &amp;ldquo;8&amp;rdquo;, you no longer have to use &lt;code&gt;netsh&lt;/code&gt; to set IP
addresses from the command-line.  Thanks to the new &lt;em&gt;NetTcpip&lt;/em&gt; module,
you can do a whole lot more network configuration via PowerShell.&lt;/p&gt;
&lt;p&gt;Here is a listing of cmdlets included in the &lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826123.aspx&#34;&gt;NetTcpip&lt;/a&gt; module:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-Command -Module NetTcpip

Capability  Name                           ModuleName
----------  ----                           ----------
CIM         Get-NetIPAddress               NetTcpip
CIM         Get-NetIPInterface             NetTcpip
CIM         Get-NetIPv4Protocol            NetTcpip
CIM         Get-NetIPv6Protocol            NetTcpip
CIM         Get-NetNeighbor                NetTcpip
CIM         Get-NetOffloadGlobalSetting    NetTcpip
CIM         Get-NetPrefixPolicy            NetTcpip
CIM         Get-NetRoute                   NetTcpip
CIM         Get-NetTCPConnection           NetTcpip
CIM         Get-NetTCPSetting              NetTcpip
CIM         Get-NetTransportFilter         NetTcpip
CIM         Get-NetUDPEndpoint             NetTcpip
CIM         Get-NetUDPSetting              NetTcpip
CIM         New-NetIPAddress               NetTcpip
CIM         New-NetNeighbor                NetTcpip
CIM         New-NetPrefixPolicy            NetTcpip
CIM         New-NetRoute                   NetTcpip
CIM         New-NetTransportFilter         NetTcpip
CIM         Remove-NetIPAddress            NetTcpip
CIM         Remove-NetNeighbor             NetTcpip
CIM         Remove-NetPrefixPolicy         NetTcpip
CIM         Remove-NetRoute                NetTcpip
CIM         Remove-NetTransportFilter      NetTcpip
CIM         Set-NetIPAddress               NetTcpip
CIM         Set-NetIPInterface             NetTcpip
CIM         Set-NetIPv4Protocol            NetTcpip
CIM         Set-NetIPv6Protocol            NetTcpip
CIM         Set-NetNeighbor                NetTcpip
CIM         Set-NetOffloadGlobalSetting    NetTcpip
CIM         Set-NetPrefixPolicy            NetTcpip
CIM         Set-NetRoute                   NetTcpip
CIM         Set-NetTCPSetting              NetTcpip
CIM         Set-NetUDPSetting              NetTcpip                                            &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To view the IP addresses on a given interface, use
&lt;em&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826136.aspx&#34;&gt;Get-NetIpAddress&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-NetIPAddress -InterfaceIndex 17 | ft -AutoSize

ifIndex IPv4Address    IPv6Address                       PrefixLength SuffixOrigin Store
------- -----------    -----------                       ------------ ------------ -----
17                     fe80::901:6a7e:d676:2a88%17       64           Link         Active
17                     2001:470:8:1ee:901:6a7e:d676:2a88 64           Link         Active
17      169.254.42.136                                   16           Link         Active&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see, I only have an auto-configured IPv4 address on this
particular interface.  You can remove addresses with
&lt;em&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826145.aspx&#34;&gt;Remove-NetIPAddress&lt;/a&gt;&lt;/em&gt;,
like so:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-NetIPAddress -InterfaceIndex 17 -AddressFamily IPv4 | Remove-NetIPAddress

Confirm
Are you sure you want to perform this action?

Performing operation &amp;#34;Remove&amp;#34; on Target &amp;#34;NetIPAddress -IPv4Address 192.168.2.3 -InterfaceIndex 17 -Store Active&amp;#34;
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is &amp;#34;Y&amp;#34;): Y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To view route information, use
&lt;em&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826148.aspx&#34;&gt;Get-NetRoute&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-NetRoute -InterfaceIndex 17

ifIndex    RouteMetric     DestinationPrefix                        NextHop                      Store
-------    -----------     -----------------                        -------                      -----
17         1               0.0.0.0/0                                192.168.2.1                  Persistent
17         256             255.255.255.255/32                       0.0.0.0                      Active
17         256             224.0.0.0/4                              0.0.0.0                      Active
17         256             192.168.2.3/32                           0.0.0.0                      Active
17         1               0.0.0.0/0                                192.168.2.1                  Active
17         256             ff00::/8                                 ::                           Active
17         256             fe80::901:6a7e:d676:2a88/128             ::                           Active
17         256             fe80::/64                                ::                           Active
17         256             2001:470:8:1ee:901:6a7e:d676:2a88/128    ::                           Active
17         256             2001:470:8:1ee::/64                      ::                           Active
17         256             ::/0                                     fe80::20d:b9ff:fe15:e69d     Active    

PS C:\&amp;gt; Get-NetRoute -InterfaceIndex 17 -RouteMetric 1

ifIndex    RouteMetric     DestinationPrefix     NextHop         Store
-------    -----------     -----------------     -------         -----
17         1               0.0.0.0/0             192.168.2.1     Persistent
17         1               0.0.0.0/0             192.168.2.1     Active    &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip;and to remove routes, use the appropriately-named
&lt;em&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826124.aspx&#34;&gt;Remove-NetRoute&lt;/a&gt;&lt;/em&gt;
cmdlet:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-NetRoute -InterfaceIndex 17 -RouteMetric 1 | Remove-NetRoute

Confirm
Are you sure you want to perform this action?

Performing operation &amp;#34;Remove&amp;#34; on Target &amp;#34;NetRoute -DestinationPrefix 0.0.0.0/0 -InterfaceIndex 17 -NextHop 192.168.2.1
-Store Persistent&amp;#34;
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is &amp;#34;Y&amp;#34;): Y

Confirm
Are you sure you want to perform this action?

Performing operation &amp;#34;Remove&amp;#34; on Target &amp;#34;NetRoute -DestinationPrefix 0.0.0.0/0 -InterfaceIndex 17 -NextHop 192.168.2.1
-Store Active&amp;#34;
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is &amp;#34;Y&amp;#34;): Y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, to assign a static IP address to an interface, use the
&lt;em&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826150.aspx&#34;&gt;New-NetIpAddress&lt;/a&gt;&lt;/em&gt;
cmdlet.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; New-NetIPAddress -InterfaceIndex 17 -IPv4Address 192.168.2.3 -DefaultGateway 192.168.2.1 -AddressFamily IPv4

Store             : Active
IPv4Address       : 192.168.2.3
IPv6Address       :
InterfaceIndex    : 17
InterfaceAlias    : NicTeam
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 32
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Tentative
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False

Store             : Persistent
IPv4Address       : 192.168.2.3
IPv6Address       :
InterfaceIndex    : 17
InterfaceAlias    : NicTeam
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 32
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Invalid
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you assign a static IP address to an interface and set the default
gateway, it also inserts a default route into the routing table (as it
should).  (This is why I removed the default route earlier; to show this
behavior.)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-NetRoute -InterfaceIndex 17 

ifIndex    RouteMetric     DestinationPrefix      NextHop         Store
-------    -----------     -----------------      -------         -----
17         256             0.0.0.0/0              192.168.2.1     Persistent
17         256             255.255.255.255/32     0.0.0.0         Active
17         256             224.0.0.0/4            0.0.0.0         Active
17         256             192.168.2.3/32         0.0.0.0         Active
17         256             0.0.0.0/0              192.168.2.1     Active
[...]&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>NIC Teaming with Windows 8</title>
      <link>https://www.thecrosseroads.net/archive/2012/03/nic-teaming-with-windows-8/</link>
      <pubDate>Mon, 19 Mar 2012 22:38:00 -0400</pubDate>
      
      <guid>https://www.thecrosseroads.net/archive/2012/03/nic-teaming-with-windows-8/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s pretty easy to create a &lt;a href=&#34;http://en.wikipedia.org/wiki/Link_aggregation&#34;&gt;NIC team&lt;/a&gt; with Windows Server &amp;ldquo;8&amp;rdquo;.  If you
have tried with previous versions of Windows you know that third-party
software was required.  Now, it&amp;rsquo;s just a cmdlet away.&lt;/p&gt;
&lt;p&gt;Have a look a the new &lt;em&gt;NetLbfo&lt;/em&gt; module:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\Users\Administrator&amp;gt; Get-Command -Module NetLbfo

Capability  Name                       ModuleName
----------  ----                       ----------
CIM         Add-NetLbfoTeamMember      NetLbfo
CIM         Add-NetLbfoTeamNic         NetLbfo
CIM         Get-NetLbfoTeam            NetLbfo
CIM         Get-NetLbfoTeamMember      NetLbfo
CIM         Get-NetLbfoTeamNic         NetLbfo
CIM         New-NetLbfoTeam            NetLbfo
CIM         Remove-NetLbfoTeam         NetLbfo
CIM         Remove-NetLbfoTeamMember   NetLbfo
CIM         Remove-NetLbfoTeamNic      NetLbfo
CIM         Rename-NetLbfoTeam         NetLbfo
CIM         Set-NetLbfoTeam            NetLbfo
CIM         Set-NetLbfoTeamMember      NetLbfo
CIM         Set-NetLbfoTeamNic         NetLbfo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using the (also-new) &lt;em&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/hh826135.aspx&#34;&gt;Get-NetIPInterface&lt;/a&gt;&lt;/em&gt; cmdlet, find the interfaces that
you want to team&amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\Users\Administrator&amp;gt; Get-NetIPInterface

ifIndex ifAlias                        AddressFamily ConnectionState NlMtu(Bytes)   InterfaceMetric Dhcp     Store
------- -------                        ------------- --------------- ------------   --------------- ----     -----
24      Teredo Tunneling Pseudo-Int... IPv6          Disconnected    1280           50              Enabled  Persistent
23      isatap.crosse.org              IPv6          Disconnected    1280           50              Enabled  Persistent
13      Wired Ethernet Connection 2    IPv6          Disconnected    1500           10              Enabled  Persistent
12      Wired Ethernet Connection      IPv6          Disconnected    1500           10              Enabled  Persistent
10      Local Area Connection* 9       IPv6          Disconnected    0              0               Enabled  Persistent
13      Wired Ethernet Connection 2    IPv6          Connected       1500           10              Enabled  Active
12      Wired Ethernet Connection      IPv6          Connected       1500           10              Enabled  Active
24      Teredo Tunneling Pseudo-Int... IPv6          Connected       1280           50              Disabled Active
23      isatap.crosse.org              IPv6          Disconnected    1280           50              Disabled Active
1       Loopback Pseudo-Interface 1    IPv6          Connected       4294967295     50              Disabled Active
13      Wired Ethernet Connection 2    IPv4          Disconnected    1500           10              Enabled  Persistent
12      Wired Ethernet Connection      IPv4          Disconnected    1500           10              Enabled  Persistent
10      Local Area Connection* 9       IPv4          Disconnected    0              0               Enabled  Persistent
13      Wired Ethernet Connection 2    IPv4          Connected       1500           10              Enabled  Active
12      Wired Ethernet Connection      IPv4          Connected       1500           10              Enabled  Active
1       Loopback Pseudo-Interface 1    IPv4          Connected       4294967295     50              Disabled Active&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip;and then use the &lt;em&gt;New-NetLbfoTeam&lt;/em&gt; cmdlet to create the team.  I&amp;rsquo;m
using this server for Hyper-V, hence choosing that for the
load-balancing algorithm.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\Users\Administrator&amp;gt; New-NetLbfoTeam -Name &amp;#34;NicTeam&amp;#34; -TeamMembers `
&amp;gt;&amp;gt; &amp;#34;Wired Ethernet*&amp;#34; -TeamNicName &amp;#34;NicTeam&amp;#34; -TeamingMode SwitchIndependent `
&amp;gt;&amp;gt; -LoadBalancingAlgorithm HyperVPort

Confirm
Are you sure you want to perform this action?

Creates Team:&amp;#39;NicTeam&amp;#39; with TeamNic:&amp;#39;NicTeam&amp;#39;; Members:&amp;#39;Wired Ethernet Connection 2&amp;#39;; &amp;#39;Wired Ethernet Connection&amp;#39;;
TeamingMode:&amp;#39;SwitchIndependent&amp;#39;; LoadBalancingAlgorithm:&amp;#39;HyperVPort&amp;#39;
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is &amp;#34;Y&amp;#34;): Y

Name                   : NicTeam
Members                : {Wired Ethernet Connection 2, Wired Ethernet Connection}
TeamNics               : NicTeam
TeamingMode            : SwitchIndependent
LoadBalancingAlgorithm : HyperVPort
Status                 : Down&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When I ran &lt;em&gt;Get-NetLbfoTeam&lt;/em&gt; immediately after creating the team, it
took a minute or so before the Status went from Down to Up:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\Users\Administrator&amp;gt; Get-NetLbfoTeam NicTeam

Name                   : NicTeam
Members                : {Wired Ethernet Connection 2, Wired Ethernet Connection}
TeamNics               : NicTeam
TeamingMode            : SwitchIndependent
LoadBalancingAlgorithm : HyperVPort
Status                 : Degraded

[time passes]

PS C:\Users\Administrator&amp;gt; Get-NetLbfoTeam

Name                   : NicTeam
Members                : {Wired Ethernet Connection 2, Wired Ethernet Connection}
TeamNics               : NicTeam
TeamingMode            : SwitchIndependent
LoadBalancingAlgorithm : HyperVPort
Status                 : Up&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that&amp;rsquo;s pretty much it!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Using PowerShell to Remotely Query WMI</title>
      <link>https://www.thecrosseroads.net/archive/2009/04/using-powershell-to-remotely-query-wmi/</link>
      <pubDate>Fri, 17 Apr 2009 16:59:00 -0400</pubDate>
      
      <guid>https://www.thecrosseroads.net/archive/2009/04/using-powershell-to-remotely-query-wmi/</guid>
      <description>&lt;p&gt;In one of the Desktop Management meetings here at the University, the
question arose as to how we could more accurately judge how many
machines we could remotely manage.  Many of the desktops had gone
through a successful, but fairly invasive migration process to get them
into the domain, and as such things usually happen, there are a few that
are a bit&amp;hellip;&amp;ldquo;wonky&amp;rdquo;.  SMS works fine for these desktops, but since the
SMS client on the desktop requests a package (i.e., pulls) from the
server, successful package installation isn&amp;rsquo;t a good indicator of remote
manageability (via scripting, etc.).  There were also many other things
we wanted to know&amp;ndash;how many had IPSec functioning properly (used to
secure remote administration traffic) being one of them.  So, I decided
to pull together a script that could be run against our desktop fleet to
determine just how many machines were &amp;ldquo;healthy&amp;rdquo;, from a
remote-manageability standpoint.&lt;/p&gt;
&lt;p&gt;The script follows a pretty simple pattern:  Can I ping the machine?  If
so, can I connect to the remote WMI provider?  If so, finally query for
and return some (user-configurable) data.  The ping test starts it all
off; if I can&amp;rsquo;t ping the machine, there&amp;rsquo;s no point in trying to do
anything else.  This also verifies that IPSec is working, since all
traffic between our management server and the desktops uses IPSec&amp;ndash;even
ICMP.&lt;/p&gt;
&lt;p&gt;The second test &lt;em&gt;(can I connect via WMI?)&lt;/em&gt; verifies that the management
server can get to the RPC endpoint mapper service (TCP port 135) and can
successfully connect to the high port on which epmap tells us the WMI
provider is listening.  If this works it will return pretty quickly; if
it doesn&amp;rsquo;t, the script has to wait something like 45 seconds for the
attempted connection to time out (if anyone knows how to impose a
shorter timeout in PowerShell, I&amp;rsquo;m all-ears).  Once the script
determines that WMI is open to us, it will begin querying the remote
computer for the requested data.&lt;/p&gt;
&lt;p&gt;Speaking of &amp;ldquo;requested data&amp;rdquo;, the script must be provided an XML file
containing the data we want returned (see below for an example).  One of
the neat things about PowerShell is that it can take an XML file and
dynamically build an object based on it (the DOM and all that).  I used
this to make the script self-contained, with only the attributes file
needing to be modified if we wanted alternate data.&lt;/p&gt;
&lt;p&gt;The script returns an object that contains all the requested values as
Properties of the object.  I can take this output and pipe it to, say,
&lt;a href=&#34;http://technet.microsoft.com/en-us/library/dd347724.aspx&#34;&gt;Export-Csv&lt;/a&gt; or &lt;a href=&#34;http://technet.microsoft.com/en-us/library/dd347657.aspx&#34;&gt;Export-Clixml&lt;/a&gt; for better presentation in a
spreadsheet or whatever.&lt;/p&gt;
&lt;p&gt;To download the script, &lt;a href=&#34;https://bitbucket.org/crosse3/powershell/raw/HEAD/scripts/dtm/Get-Info.ps1&#34;&gt;click here&lt;/a&gt;.  From this point on, I&amp;rsquo;ll
go through the script and explain the relevant bits, starting with line
38 (the first part is just licensing, etc.)&lt;/p&gt;
&lt;p&gt;The first part is the &lt;code&gt;param&lt;/code&gt; statement, followed by a BEGIN block.  The
&lt;code&gt;param&lt;/code&gt; statement specifies what parameters and switches the script
should expect.  (Note below that if you don&amp;rsquo;t provide the script with
the &lt;em&gt;-AttributesFile&lt;/em&gt; parameter it will try to find a file called
&amp;ldquo;Attributes.xml&amp;rdquo; in the current directory and use that.)  The BEGIN
block is where you can put code that should only be executed once for
the entire pipeline, at the beginning before any pipeline data is
processed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;k&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$AttributesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Attributes.xml&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[switch]&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$inputObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;BEGIN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# This section executes before the pipeline.&lt;/span&gt;

    &lt;span class=&#34;c&#34;&gt;# This has something to do with pipelining.  &lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Let&amp;#39;s call it &amp;#34;magic voodoo&amp;#34; for now.&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$inputObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Write-Output&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$inputObject&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MyInvocation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InvocationName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-AttributesFile&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$AttributesFile&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I feel I have to explain the &amp;ldquo;magic voodoo&amp;rdquo;, but I can&amp;rsquo;t explain it any
better than the guy I stole it from, so &lt;a href=&#34;http://huddledmasses.org/writing-better-script-functions-for-the-powershell-pipeline/&#34;&gt;check out this blog&lt;/a&gt;
about what it all means.&lt;/p&gt;
&lt;p&gt;The following section tries to find the
&lt;a href=&#34;http://www.quest.com/powershell/activeroles-server.aspx&#34;&gt;Quest ActiveRoles Management Snapin&lt;/a&gt;.  (You&amp;rsquo;ll need this in
order for the script to function, as some data is gathered from AD about
each computer object.)  I think the comments below speak for themselves.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Check to ensure that the Quest snapin has been registered.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Iterate through all the loaded snapins, searching for the Quest snapin.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$snapin&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-PSSnapin&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Sort-Object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Property&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$snapin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToUpper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;QUEST.ACTIVEROLES.ADMANAGEMENT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Done, we have the extension and it&amp;#39;s loaded.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$questLoaded&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$True&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$questLoaded&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# The Quest snapin was not loaded, so see if the &lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# extension is at least registered with the system.&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$snapin&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-PSSnapin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-registered&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Sort-Object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Property&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$snapin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToUpper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;QUEST.ACTIVEROLES.ADMANAGEMENT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# Found the snapin; add it to the environment.&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;trap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;Add-PSSnapin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Quest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ActiveRoles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ADManagement&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Quest Active Directory Management Extensions found and added to this session.&amp;#34;&lt;/span&gt;
            &lt;span class=&#34;nv&#34;&gt;$questLoaded&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$True&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$questLoaded&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# The Quest snapin is not installed on this system.&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Print an error and bail.&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Error&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Category&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NotInstalled&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;`&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;-RecommendedAction&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Install Quest Active Directory Management Extensions&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;`&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;-Message&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Quest Active Directory Management Extensions are not installed.  Please install the Extensions and re-run this command.&amp;#34;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next some variables are set up, and the script ensures that it can find
an attributes file, and that it is valid XML.  If it can, then it&amp;rsquo;s time
to start processing the pipeline.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Create the $ping object just once for the entire pipeline, so it can be reused.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$ping&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;New-Object&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Net&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NetworkInformation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Ping&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# See if an Attributes file was specified.  If not, bail.&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$AttributesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$AttributesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;No Attributes file specified, or path does not exist: $AttributesFile&amp;#34;&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# Commented out so that we fall through to the PROCESS block and print the usage &lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# information there.&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;#continue&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# If we got here, then the Attributes file exists.  Try to load it.&lt;/span&gt;
        &lt;span class=&#34;no&#34;&gt;[xml]&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$attrFile&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$AttributesFile&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$attrFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# Oops, either the file specified wasn&amp;#39;t an XML file, or there was&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# an error in the file somewhere.  Bail.&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Error in $AttributesFile&amp;#34;&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# If we made it this far, start chucking stuff down the pipeline into the PROCESS block.&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;BEGIN&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Like the comment says, the PROCESS block is executed for each object on
the pipeline.  This is where the real work happens, unless no data was
passed in; if not, the script prints a usage statement and dies.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;k&#34;&gt;PROCESS&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;   &lt;span class=&#34;c&#34;&gt;# This section executes for each object in the pipeline.&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# Did we get data, either from the pipeline or explicitly on the command line?&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# If not, print out some (arguably &amp;#34;useful&amp;#34;) help.&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-and&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$AttributesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;sh&#34;&gt;@&amp;#34;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;        
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;USAGE:  ps_GetInfo [-v] -Computer &amp;lt;Computer&amp;gt; [-AttributesFile &amp;lt;Attributes.xml&amp;gt;]
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;Retrieve information from a remote computer.
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;Example: ps_GetInfo -Computer &amp;#34;$Env:ComputerName&amp;#34; -AttributesFile .\Attributes.xml
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;-v                  Verbose.  Writes the current computer name to the console.
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;                    Useful to monitor the progress of a pipeline operation.
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;-Computer           The computer to which you want to connect.
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;-AttributesFile     An XML file containing the attributes to retrieve.
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;                    If not specified, look for a file called &amp;#34;Attributes.xml&amp;#34;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;                    in the current directory.
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sh&#34;&gt;&amp;#34;@&lt;/span&gt;

        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# If we got data via the pipeline, assign it to a named variable &lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# to make things easier to read.&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This part uses Quest&amp;rsquo;s tools to try to find the computer object in
Active Directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Try to find the computer in AD.  I guess this isn&amp;#39;t really needed,&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# but it&amp;#39;s one more validation that the computer exists.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ArsComputerObject&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# A Computer Object was passed; set an interim variable to the ArsComputerObject.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$objComputer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;elseif&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;String&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# A bare string was passed.  Turn it into an ArsComputerObject and&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# find it in Active Directory, then return the DnsName.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$objComputer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-QADComputer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Name&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$objComputer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# The computer account wasn&amp;#39;t found in AD.  Bail on this object.&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;$Computer is not in Active Directory.&amp;#34;&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# We have no idea what this object is.  Bail.&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;$Computer is not an ArsComputerObject or a String.&amp;#34;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, I create a new object to hold all the (hopefully) returned data.
Again, the comments should speak for themselves.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Construct a new generic object to represent the Computer and use &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Add-Member to add some generic properties to the object.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;New-Object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PSObject&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Add-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-PassThru&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NoteProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$objComputer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DnsName&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# This property specifies whether the computer was able to be pinged.&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;Add-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NoteProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Pingable&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$False&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# This property specifies whether the script could connect to WMI on the remote computer.&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;Add-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NoteProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConnectViaWmi&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$False&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# This property records the ModifcationDate (WhenChanged) property from the AD object.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Useful to decide how stale the computer object is.&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;Add-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NoteProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ADModificationDate&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$objComputer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ModificationDate&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Iterate over the WMI Classes and Properties specified in the Attributes file and &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# add properties to the $Computer object corresponding to the various&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# attributes in the Attributes file.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$class&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$attrFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attributes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Classes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# Make sure to Trim() off any random whitespace from the XML file.&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Add-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NoteProperty&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$null&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Iterate over the files specified in the Attributes file and&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# add properties to the $Computer object.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$attrFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attributes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Files&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Trim() off any random whitespace from the XML file.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$propName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Add-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NoteProperty&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$propName&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$null&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Try to ping the target computer.  This uses the .NET Class
&lt;a href=&#34;http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx&#34;&gt;System.Net.NetworkInformation.Ping&lt;/a&gt; .  (Dynamic typing is great, but
sometimes I like strongly-typed objects, I guess.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Since System.Net.NetworkInformation.Ping.Send() will generate&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# a nasty exception if the ping fails, and since it&amp;#39;s a .NET object&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# (and doesn&amp;#39;t implement the &amp;#34;-ErrorAction&amp;#34; parameter), &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# suppress printing exceptions for this call.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$ErrorActionPreference&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SilentlyContinue&amp;#34;&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$reply&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$null&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Ping the computer to see if it is alive.&lt;/span&gt;
&lt;span class=&#34;no&#34;&gt;[System.Net.NetworkInformation.PingReply]&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$reply&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$ErrorActionPreference&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Continue&amp;#34;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# The following logic test uses the .NET Enumeration &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# instead of a string match, just in case.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$reply&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Status&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Net.NetworkInformation.IPStatus]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Success&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# The computer is pingable, so note that and do some more stuff.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Pingable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$True&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here&amp;rsquo;s the workhorse section:  verify that we can connect to WMI, and
then for each attribute specified in the file, query the remote computer
for it and save it in our computer object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;    &lt;span class=&#34;c&#34;&gt;# Clear the $wmi variable.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$null&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# Iterate through all WMI classes and get the various attributes&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# specified in the Attributes.xml file.&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$class&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$attrFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attributes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Classes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-WmiObject&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ComputerName&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ErrorAction&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SilentlyContinue&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;
        
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# We were able to connect to WMI.  Note this and continue.&lt;/span&gt;
            &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectViaWmi&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$True&lt;/span&gt;
            
            &lt;span class=&#34;c&#34;&gt;# This actually retrieves the requested properties &lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# from the specified WMI class and sets the relevant&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# property on the $Computer object.&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;c&#34;&gt;# Get the value of the property, trimming off any whitespace&lt;/span&gt;
                &lt;span class=&#34;c&#34;&gt;# that may have made it into the XML file.&lt;/span&gt;
                &lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
                
                &lt;span class=&#34;c&#34;&gt;# On the off-chance that this Property is of the type CimType.DateTime,&lt;/span&gt;
                &lt;span class=&#34;c&#34;&gt;# convert it to a more friendly string.&lt;/span&gt;
                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PSBase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Properties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Type &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Management.CimType]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;c&#34;&gt;# Retrieve the property, convert it, and save it.&lt;/span&gt;
                    &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConvertToDateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;c&#34;&gt;# Retrieve the property and save it.&lt;/span&gt;
                    &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$property&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end if&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end foreach ($property)&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end if ($wmi)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end foreach ($class)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This next section retrieves file information, also via WMI.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;        &lt;span class=&#34;c&#34;&gt;# Since getting file information is a WMI call, only attempt it &lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# if the initial connection to WMI was successful.&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# Iterate over all of the files specified in the Attributes file &lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# and record the relevant information.&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$f&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$attrFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attributes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Files&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;c&#34;&gt;# Just like above, construct the basename for the property name&lt;/span&gt;
                &lt;span class=&#34;nv&#34;&gt;$baseName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
                &lt;span class=&#34;c&#34;&gt;# The WMI call wants escaped backslashes.&lt;/span&gt;
                &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$baseName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;\\&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
                
                &lt;span class=&#34;c&#34;&gt;# Retrieve the file&amp;#39;s metadata from WMI (hopefully).&lt;/span&gt;
                &lt;span class=&#34;nv&#34;&gt;$fObj&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-WmiObject&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ComputerName&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Class&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CIM_Datafile&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Filter&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Name=&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;`&amp;#39;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;`&amp;#39;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ErrorAction&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SilentlyContinue&lt;/span&gt;
                
                &lt;span class=&#34;c&#34;&gt;# If the file was found...&lt;/span&gt;
                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$fObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;c&#34;&gt;# ...and it has a version number...&lt;/span&gt;
                    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$fObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                        &lt;span class=&#34;c&#34;&gt;# ...write that to the $Computer object...&lt;/span&gt;
                        &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$baseName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$fObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Version&lt;/span&gt;
                    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                        &lt;span class=&#34;c&#34;&gt;# ...or else just record the fact that it was found.&lt;/span&gt;
                        &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$baseName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$True&lt;/span&gt;
                    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;c&#34;&gt;# The file wasn&amp;#39;t found, so set the property to false.&lt;/span&gt;
                    &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$baseName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$False&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end if&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end foreach ($f)&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end if ($wmi)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end if (Pingable)&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# We&amp;#39;re done with this computer, so output it to pass it on down the pipeline.&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Output&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Computer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The pipeline is now over, and the last section is the END block&amp;hellip;which
is not needed here, so it&amp;rsquo;s empty.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;    &lt;span class=&#34;k&#34;&gt;END&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;   &lt;span class=&#34;c&#34;&gt;# This section executes only once, after the pipeline.&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# Of course, there&amp;#39;s not much we need to do here.&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;END&amp;#39;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end function&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And with that, we&amp;rsquo;re done with the script.  Now, on to the attributes
file and what it should look like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Attributes&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Wmi&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Classes&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;Class&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Win32_OperatingSystem&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;Property&amp;gt;&lt;/span&gt;
            LastBootUpTime
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;Property&amp;gt;&lt;/span&gt;
            ServicePackMajorVersion
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;Property&amp;gt;&lt;/span&gt;
            ServicePackMinorVersion
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Class&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;Class&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Win32_ComputerSystem&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;Property&amp;gt;&lt;/span&gt;
            UserName
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Class&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;Class&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Win32_BIOS&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;Property&amp;gt;&lt;/span&gt;
            SerialNumber
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Class&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Classes&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Wmi&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Files&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;File&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.dll&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;File&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.dll&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Files&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Attributes&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hopefully this is easy enough to understand:  the &lt;code&gt;&amp;lt;Class Name=&amp;quot;...&amp;quot;&amp;gt;&lt;/code&gt;
sections describe which WMI class to query, and the &lt;code&gt;&amp;lt;Property/&amp;gt;&lt;/code&gt;
sections within each &lt;code&gt;&amp;lt;Class&amp;gt;&lt;/code&gt; section describe the various properties
to retrieve.  The &lt;code&gt;&amp;lt;Files/&amp;gt;&lt;/code&gt; section describes which files to check.
Note that the script only checks for the existence of the file and will
return the version number, if it has one.  If I get around to it, I&amp;rsquo;d
like to update the script to also check files for a specific version
number (which is why the &lt;code&gt;&amp;lt;File/&amp;gt;&lt;/code&gt; tags have &lt;em&gt;Version&lt;/em&gt; values).&lt;/p&gt;
&lt;p&gt;The output of this script looks something like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; .\ps_GetInfo.ps1 -Computer &amp;#34;my_computer&amp;#34;


Name                                                        : my_computer.fqdn
Pingable                                                    : True
ConnectViaWmi                                               : True
ADModificationDate                                          : 4/20/2009 6:33:34 PM
LastBootUpTime                                              : 4/16/2009 5:16:37 PM
ServicePackMajorVersion                                     : 0
ServicePackMinorVersion                                     : 0
UserName                                                    : DOMAIN\wrightst
SerialNumber                                                : [DellServiceTagHere]
C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.dll : 9.1.0.163
C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.dll       : False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Granted, it probably would look better if I didn&amp;rsquo;t have to abstract some of
the more important parts, but that&amp;rsquo;s what you get.  If you wanted to run
this command against an entire OU, you can use the Quest extensions to do
something like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-QADComputer -SearchRoot my.domain.local/My/Search/Root | 
&amp;gt;&amp;gt; .\ps_GetInfo -AttributesFile .\Attributes.xml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ps1con&#34; data-lang=&#34;ps1con&#34;&gt;PS C:\&amp;gt; Get-QADComputer -SearchRoot my.domain.local/My/Search/Root | 
&amp;gt;&amp;gt; .\ps_GetInfo -v -AttributesFile .\Attributes.xml | Export-Csv output.csv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first line will output the results from processing each computer
object just like above.  For better-looking output, pipe the command
through &lt;a href=&#34;http://technet.microsoft.com/en-us/library/dd347724.aspx&#34;&gt;Export-Csv&lt;/a&gt; like the last line, and produce a nice report.
(The &amp;lsquo;-v&amp;rsquo; switch in the second command line will output the name of the
computer the script is currently working on; without it there is no
visible sign that the script is working, since all output is being piped
to the &lt;a href=&#34;http://technet.microsoft.com/en-us/library/dd347724.aspx&#34;&gt;Export-Csv&lt;/a&gt; cmdlet.)&lt;/p&gt;
&lt;p&gt;I know there are a few minor bugs with this script (currently you &lt;em&gt;have&lt;/em&gt;
to query for a file&amp;ndash;even if it&amp;rsquo;s just a nonexistent file&amp;ndash;or else the
script complains loudly), but I just finished running it against a few
thousand computers with no errors, so it still works pretty well.  ;-)
If you see something that could be done better or easier, or if this
helps you in your environment, please let me know!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>&#34;OALGen is running on the wrong CCR cluster node&#34;</title>
      <link>https://www.thecrosseroads.net/archive/2009/04/oalgen-is-running-on-the-wrong-ccr-cluster-node/</link>
      <pubDate>Thu, 16 Apr 2009 16:57:00 -0400</pubDate>
      
      <guid>https://www.thecrosseroads.net/archive/2009/04/oalgen-is-running-on-the-wrong-ccr-cluster-node/</guid>
      <description>&lt;p&gt;Sometimes I just have to wonder.&lt;/p&gt;
&lt;p&gt;It seems that the Microsoft Exchange Team thought that you&amp;rsquo;d always want
one Exchange Server 2007 CCR node to be the active, &amp;ldquo;primary&amp;rdquo; node, and
the other node would always be the passive, &amp;ldquo;secondary&amp;rdquo; node.  This
isn&amp;rsquo;t exactly a problem, &lt;em&gt;per se&lt;/em&gt;, except that there may be times when
you want (or need) to make the &amp;ldquo;secondary&amp;rdquo; node the active one for an
extended period of time.  Still, not a problem, right?  Sure&amp;hellip;except
when the System Attendant goes to regenerate the offline address
book(s).  At that point, you&amp;rsquo;ll get a nasty warning in the Application
event log, EventID 9395: &amp;ldquo;OALGen is running on the wrong CCR cluster
node&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;But wait, you say: &amp;ldquo;I thought CCR was a &lt;em&gt;clustering&lt;/em&gt; technology, and as
such it wouldn&amp;rsquo;t matter which node was active?&amp;rdquo;  Me, too, but apparently
this isn&amp;rsquo;t quite the case.  Reading &lt;a href=&#34;http://technet.microsoft.com/en-us/library/bb266910.aspx&#34;&gt;Microsoft&amp;rsquo;s Technet article&lt;/a&gt;
about the issue reveals this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This Warning event indicates that the Microsoft Exchange System
Attendant service is running on an active cluster continuous
replication (CCR) node, but the
&lt;code&gt;HKLM\System\CurrentControlSet\Services\MSExchangeSA\Parameters\{ClusterMailboxServerName}\EnableOabGenOnThisNode&lt;/code&gt;
registry value is not set to this node name.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;p&gt;So, it looks like either your active node always needs to be the
&lt;em&gt;primary&lt;/em&gt; node (see &lt;a href=&#34;http://blogs.msdn.com/dgoldman/archive/2007/02/08/oab-generation-on-a-cluster-server-fails-with-event-id-9395-or-9396.aspx&#34;&gt;this blog&lt;/a&gt; for more information), or the key
mentioned above needs to always be set to whatever the active node is at
the time.  My solution was to create a script that will set the
&lt;code&gt;EnableOabGenOnThisNode&lt;/code&gt; value to the currently active node and have
Task Scheduler on each node run it when specific events (MSExchange
Cluster 1028 and 1029) are seen in the Application event log.  (Note
that this is a feature of Task Scheduler in Windows Server 2008.)&lt;/p&gt;
&lt;p&gt;The script is pretty short, and doesn&amp;rsquo;t require any modification&amp;ndash;if it
is run on a CCR node, it will automatically discover the CMS Name and
the currently active node, and set the registry value appropriately.
All errors and other output are logged to the Application event log with
the source of &lt;code&gt;EnableOabGen&lt;/code&gt;, so if you use a monitoring solution like
Zenoss (my choice), MOM/SCOM, etc., you can have it pick up the events
from the event log.&lt;/p&gt;
&lt;p&gt;I apologize for the long lines in advance.  Also, I may not always
remember to update this post with the &amp;ldquo;latest&amp;rdquo; version of the script,
but you can always pull the latest version &lt;a href=&#34;https://bitbucket.org/crosse3/powershell/raw/HEAD/scripts/exchange/Enable-OabGenOnThisNode.ps1&#34;&gt;here&lt;/a&gt;.  (Also note that
this script used to be called &lt;code&gt;ps_enableoabgenonthisnode.ps1&lt;/code&gt;, but I
decided to change the name to make it fit the Verb-Noun pattern, like
all good PowerShell scripts should :-) .)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;################################################################################&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# NAME  : ps_EnableOabGenOnThisNode.ps1&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# AUTHOR: Seth Wright , James Madison University&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# DATE  : 4/14/2009&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# DESCRIPTION:  This script sets the &amp;#39;EnableOabGenOnThisNode&amp;#39; registry key on &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#               a CCR node member to the active node in the cluster.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#               Reference http://technet.microsoft.com/en-us/library/bb266910.aspx&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#               for more information.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Redistribution and use in source and binary forms, with or without           &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# modification, are permitted provided that the following conditions are met:  &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#  1. Redistributions of source code must retain the above copyright notice,   &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#     this list of conditions and the following disclaimer.                    &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#  2. Redistributions in binary form must reproduce the above copyright        &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#     notice, this list of conditions and the following disclaimer in the      &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#     documentation and/or other materials provided with the distribution.     &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;#39;&amp;#39; AND ANY   &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED    &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE       &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY   &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES   &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND  &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF     &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.            &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;################################################################################&lt;/span&gt;

&lt;span class=&#34;nv&#34;&gt;$CurrentNode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Env&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputerName&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$null&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Set up a new Event Source for the script, if it doesn&amp;#39;t already exist.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;[System.Diagnostics.EventLog]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceExists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;EnableOabGen&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Diagnostics.EventLog]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CreateEventSource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;EnableOabGen&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Application&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Get the Application event log into the $Log variable.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;New-Object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Diagnostics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EventLog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Application&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;EnableOabGen&amp;#34;&lt;/span&gt;

&lt;span class=&#34;nv&#34;&gt;$error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Clear&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$CMSName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-MailboxServer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;where &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RedundantMachines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$CurrentNode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CMSName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;[String]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# The CMSName couldn&amp;#39;t be determined.  Either the script doesn&amp;#39;t have&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# network access, or the computer is not part of a CCR cluster, or something&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# else is broke.  Log the error and bail.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Could not determine the CMSName: &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Diagnostics.EventLogEntryType]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Find the active node of the CMS.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# First, get a list of all nodes in the CMS.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Clear&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$OperationalMachines&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-ClusteredMailboxServerStatus&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Identity&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$CMSName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OperationalMachines&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OperationalMachines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;[String]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Couldn&amp;#39;t determine the active node.  Something&amp;#39;s not right, so don&amp;#39;t try&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# to do anything else.  Log the error and bail.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Could not determine OperationalMachines: &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Diagnostics.EventLogEntryType]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# $pattern is the regex pattern to use to look for node marked as &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &amp;lt;Active...&amp;gt; in the OperationalMachines array.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$activePattern&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;^(?&amp;lt;activenode&amp;gt;.*)\s+&amp;lt;Active.*&amp;#34;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Perform the regex match.  $match is a throw-away variable.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$match&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$OperationalMachines&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;where &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-match&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$activePattern&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$matches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;activenode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# No regex matches were found.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Cannot determine the Active Node of CMS $CMSName&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Diagnostics.EventLogEntryType]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# A regex match was found for the Active Node.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$ActiveNode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$matches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;activenode&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# This is the base registry key&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$baseKey&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;HKLM:\SYSTEM\CurrentControlSet\Services\MSExchangeSA\Parameters\&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$CMSName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Get the registry value &amp;#34;EnableOabGenOnThisNode&amp;#34; and check it against what it should be.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$result&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-ItemProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$baseKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EnableOabGenOnThisNode&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-notlike&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ActiveNode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# The value is wrong, so set it to the currently-active node.&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Set-ItemProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$baseKey&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Name&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;EnableOabGenOnThisNode&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Value&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;$ActiveNode&amp;#34;&lt;/span&gt;
    
    &lt;span class=&#34;nv&#34;&gt;$result&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$null&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# Get the new value.  There could probably be a check that the key was&lt;/span&gt;
    &lt;span class=&#34;c&#34;&gt;# properly set, but I&amp;#39;m just trying to set it once.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$result&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-ItemProperty&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$baseKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EnableOabGenOnThisNode&lt;/span&gt;
    
    &lt;span class=&#34;c&#34;&gt;# Log the change.&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;The registry value &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;EnableOabGenOnThisNode&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; on $CurrentNode has been set to $result&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[System.Diagnostics.EventLogEntryType]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This might be over-complicating matters; I haven&amp;rsquo;t decided yet.  Either
way, it works with Server 2008&amp;rsquo;s Task Scheduler.  Speaking of, here&amp;rsquo;s
the task&amp;rsquo;s XML export.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-16&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Task&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.microsoft.com/windows/2004/02/mit/task&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;RegistrationInfo&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Date&amp;gt;&lt;/span&gt;2009-04-14T17:52:21.2602543&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Date&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Description&amp;gt;&lt;/span&gt;
        This script sets the &amp;#39;EnableOabGenOnThisNode&amp;#39; registry key
        on a CCR node member to the active node in the cluster.
        Reference
        http://technet.microsoft.com/en-us/library/bb266910.aspx for
        more information.
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Description&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RegistrationInfo&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Triggers&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;EventTrigger&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Enabled&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Enabled&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Subscription&amp;gt;&amp;lt;QueryList&amp;gt;&amp;lt;Query&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Path=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Application&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&amp;lt;Select&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Path=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Application&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;*[System[Provider[@Name=&amp;#39;MSExchange Cluster&amp;#39;] and EventID=1028]]&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Select&amp;gt;&amp;lt;/Query&amp;gt;&amp;lt;/QueryList&amp;gt;&amp;lt;/Subscription&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Delay&amp;gt;&lt;/span&gt;PT15M&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Delay&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/EventTrigger&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;EventTrigger&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Enabled&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Enabled&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Subscription&amp;gt;&amp;lt;QueryList&amp;gt;&amp;lt;Query&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Path=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Application&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&amp;lt;Select&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Path=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Application&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;*[System[Provider[@Name=&amp;#39;MSExchange Cluster&amp;#39;] and EventID=1029]]&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Select&amp;gt;&amp;lt;/Query&amp;gt;&amp;lt;/QueryList&amp;gt;&amp;lt;/Subscription&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Delay&amp;gt;&lt;/span&gt;PT15M&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Delay&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/EventTrigger&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Triggers&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Principals&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Principal&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Author&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;LogonType&amp;gt;&lt;/span&gt;Password&lt;span class=&#34;nt&#34;&gt;&amp;lt;/LogonType&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;RunLevel&amp;gt;&lt;/span&gt;LeastPrivilege&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RunLevel&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Principal&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Principals&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Settings&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;IdleSettings&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Duration&amp;gt;&lt;/span&gt;PT10M&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Duration&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;WaitTimeout&amp;gt;&lt;/span&gt;PT1H&lt;span class=&#34;nt&#34;&gt;&amp;lt;/WaitTimeout&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;StopOnIdleEnd&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/StopOnIdleEnd&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;RestartOnIdle&amp;gt;&lt;/span&gt;false&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RestartOnIdle&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/IdleSettings&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;MultipleInstancesPolicy&amp;gt;&lt;/span&gt;Queue&lt;span class=&#34;nt&#34;&gt;&amp;lt;/MultipleInstancesPolicy&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;DisallowStartIfOnBatteries&amp;gt;&lt;/span&gt;false&lt;span class=&#34;nt&#34;&gt;&amp;lt;/DisallowStartIfOnBatteries&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;StopIfGoingOnBatteries&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/StopIfGoingOnBatteries&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;AllowHardTerminate&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/AllowHardTerminate&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;StartWhenAvailable&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/StartWhenAvailable&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;RunOnlyIfNetworkAvailable&amp;gt;&lt;/span&gt;false&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RunOnlyIfNetworkAvailable&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;AllowStartOnDemand&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/AllowStartOnDemand&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Enabled&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Enabled&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Hidden&amp;gt;&lt;/span&gt;false&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Hidden&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;RunOnlyIfIdle&amp;gt;&lt;/span&gt;false&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RunOnlyIfIdle&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;WakeToRun&amp;gt;&lt;/span&gt;false&lt;span class=&#34;nt&#34;&gt;&amp;lt;/WakeToRun&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;ExecutionTimeLimit&amp;gt;&lt;/span&gt;P3D&lt;span class=&#34;nt&#34;&gt;&amp;lt;/ExecutionTimeLimit&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Priority&amp;gt;&lt;/span&gt;7&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Priority&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Settings&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;Actions&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Context=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Author&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Exec&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Command&amp;gt;&lt;/span&gt;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Command&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Arguments&amp;gt;&lt;/span&gt;-PSConsoleFile &amp;#34;D:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1&amp;#34; D:\Scripts\Enable-OabGenOnThisNode.ps1&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Arguments&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Exec&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Actions&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Task&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You&amp;rsquo;ll want to change the path to the script (look for
&lt;code&gt;D:\Scripts\Enable-OabGenOnThisNode.ps1&lt;/code&gt; on line 49) either by editing
the XML file or doing it after you import the task.  Also, make sure you
change the path to the Exchange console file (&lt;code&gt;D:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1&lt;/code&gt; in the XML, also line
49) to wherever you installed Exchange.  And finally, have the task run
as a privileged user (probably an account with local Administrator
rights in order to modify the registry) and select &amp;ldquo;Run whether user is
logged on or not&amp;rdquo; on the General tab.  Put the script and that task on
both nodes, and any time the CMSName is moved onto or off of either
node, they&amp;rsquo;ll update the registry value a minute later.&lt;/p&gt;
&lt;p&gt;Since this is a work in progress, I may update this post with new
versions of the script.  If (or when) I do, I&amp;rsquo;ll make a note of what
changes have been made.&lt;/p&gt;
&lt;p&gt;EDIT 21-Jul-2010:  General housekeeping, no real changes.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A Couple of PowerShell Scripts</title>
      <link>https://www.thecrosseroads.net/archive/2008/09/a-couple-of-powershell-scripts/</link>
      <pubDate>Tue, 16 Sep 2008 16:07:00 -0400</pubDate>
      
      <guid>https://www.thecrosseroads.net/archive/2008/09/a-couple-of-powershell-scripts/</guid>
      <description>&lt;p&gt;So I went to a PowerShell training class we brought here on campus a
while back.  Going into a class like that already holding some general
knowledge of scripting and programming, as well as specific knowledge of
PowerShell (rudimentary, but still), means that by lunch-time on the
first day I was bored, bored, bored.  However, since I was basically
getting three or four full days to play with PowerShell, I decided to
play.  These three little scripts are what came out of that play-time&amp;hellip;
:-)&lt;/p&gt;
&lt;p&gt;All three of the following scripts are really &lt;strong&gt;very&lt;/strong&gt; basic; nothing
ground-breaking here.  Hopefully as I progress in my PowerShell
abilities I can provide better examples of scripts I have created to
make my job easier.&lt;/p&gt;
&lt;p&gt;The main thing to know about the scripts is that they just insert a
function into the environment.  To use them you must first execute the
script, then call the function.  In this way you can have the scripts
execute in your &lt;a href=&#34;https://bitbucket.org/crosse3/windotfiles/raw/HEAD/powershell/WindowsPowerShell/Microsoft.PowerShell_profile.ps1&#34;&gt;Microsoft.PowerShell_profile.ps1&lt;/a&gt; file, and
then the functions will be available in the environment without having
to execute the actual script.  (EDIT:  You&amp;rsquo;ll note that even I don&amp;rsquo;t use
these scripts anymore; I never updated them and the GNU versions work
just fine.  I&amp;rsquo;m leaving this post here only for historical purposes.)&lt;/p&gt;
&lt;h2 id=&#34;ps_headps1&#34;&gt;ps_head.ps1&lt;/h2&gt;
&lt;p&gt;The first script is called &lt;code&gt;ps_head.ps1&lt;/code&gt; and in all reality is just a
tiny little function.  It implements the most basic function of the Unix
&lt;code&gt;head&lt;/code&gt; command:  it returns the first few lines of a file.  The syntax
is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ps_head [-lines] &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&amp;rsquo;s the script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_head&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# head file -lines&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;global:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-10&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;String&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Get-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-totalCount&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Added ps_head to global functions.&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;White&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;ps_tailps1&#34;&gt;ps_tail.ps1&lt;/h2&gt;
&lt;p&gt;Next in line is &lt;code&gt;ps_tail.ps1&lt;/code&gt; which, as you can probably guess, does the
same thing as the Unix &lt;code&gt;tail&lt;/code&gt; command.  Syntax is the same as above:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ps_tail [-lines] &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_tail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_tail&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# ps_tail file -lines&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;global:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_tail&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;param&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-10&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[switch]&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;String&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[string]&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;nv&#34;&gt;$content&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-le&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;++)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;nv&#34;&gt;$content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Added ps_tail to global functions.&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;White&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;ps_grepps1&#34;&gt;ps_grep.ps1&lt;/h2&gt;
&lt;p&gt;The third and final script for this post is &lt;code&gt;ps_grep.ps1&lt;/code&gt;.  It
implements a couple of &lt;code&gt;grep&lt;/code&gt;&amp;rsquo;s command-line options; namely, &lt;code&gt;-c&lt;/code&gt; and
&lt;code&gt;-i&lt;/code&gt;.  The syntax is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ps_grep [-c] [-i] pattern &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Each command-line switch needs to be provided separately; currently
you&amp;rsquo;re not able to run them all together, as in &amp;ldquo;&lt;code&gt;grep -cRi pattern *.*&lt;/code&gt;&amp;rdquo;.  I might work on that. [EDIT:  clearly, I didn&amp;rsquo;t, and
won&amp;rsquo;t.])&lt;/p&gt;
&lt;p&gt;Something to note is that &lt;code&gt;ps_grep&lt;/code&gt; will loop through all of an object&amp;rsquo;s
properties in search of the supplied regex pattern and not just the
&lt;code&gt;Name&lt;/code&gt; property, etc.  Also, if you use the function in a pipeline and
&lt;em&gt;pattern&lt;/em&gt; is a simple string (i.e., not a regular expression), the match
will always be case-insensitive.  When I have a bit of time I&amp;rsquo;ll try to
figure that one out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_grep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_grep&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;global:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps_grep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;[switch]&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;[switch]&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$inputObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;BEGIN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# This section executes before the pipeline.&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# $count will contain the number of matches found.&lt;/span&gt;
        &lt;span class=&#34;nv&#34;&gt;$count&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;

        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$inputObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;nv&#34;&gt;$inputObject&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;begin&amp;#39;&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;PROCESS&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# This section executes for each object in the pipeline.&lt;/span&gt;

        &lt;span class=&#34;c&#34;&gt;# Did we get a filename?  If so we&amp;#39;re operating on a file, not stdout.&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;

            &lt;span class=&#34;c&#34;&gt;# Is the filename a valid file?&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;

                &lt;span class=&#34;c&#34;&gt;# Grep the file for $pattern, if we were given $pattern.&lt;/span&gt;
                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                        &lt;span class=&#34;c&#34;&gt;# User has specified as case-sensitive match.&lt;/span&gt;
                        &lt;span class=&#34;nv&#34;&gt;$case&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-CaseSensitive&amp;#34;&lt;/span&gt;
                    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
                    &lt;span class=&#34;nv&#34;&gt;$command&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Select-String $case -pattern $pattern -InputObject (Get-Item $file)&amp;#34;&lt;/span&gt;
                    &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$match&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Invoke-Expression&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                            &lt;span class=&#34;c&#34;&gt;# only output lines if -c was not specified.&lt;/span&gt;
                            &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$match&lt;/span&gt;
                        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
                        &lt;span class=&#34;c&#34;&gt;# Increment our count.&lt;/span&gt;
                        &lt;span class=&#34;nv&#34;&gt;$count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;++&lt;/span&gt;
                    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;if ($pattern)&amp;#39;&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;if (test-path)&amp;#39;&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;c&#34;&gt;# The filename passed does not exist.  Die.&lt;/span&gt;
                &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;File does not exist.&amp;#34;&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;else&amp;#39;&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;if ($file...)&amp;#39;&lt;/span&gt;

        &lt;span class=&#34;c&#34;&gt;# Didn&amp;#39;t get a filename, so we&amp;#39;re operating on stdout.&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;elseif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;c&#34;&gt;# Save the pipelined object into an internal var to avoid confusion below.&lt;/span&gt;
            &lt;span class=&#34;nv&#34;&gt;$obj&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;

            &lt;span class=&#34;c&#34;&gt;# Loop through $obj&amp;#39;s properties and look for $pattern&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$prop&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$obj&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-Member&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-MemberType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Properties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$prop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-match&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                        &lt;span class=&#34;c&#34;&gt;# Found a match, output the result to stdout.&lt;/span&gt;
                        &lt;span class=&#34;nb&#34;&gt;Write-Output&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$obj&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MyInvocation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InvocationName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-inputObject&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;
                    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

                    &lt;span class=&#34;c&#34;&gt;# Increment our count.&lt;/span&gt;
                    &lt;span class=&#34;nv&#34;&gt;$count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;++&lt;/span&gt;

                    &lt;span class=&#34;c&#34;&gt;# No reason to keep searching this property.&lt;/span&gt;
                    &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;if ($obj...)&amp;#39;&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;foreach&amp;#39;&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;elseif&amp;#39;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;process&amp;#39;&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;END&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;# If &amp;#39;-c&amp;#39; was specified on the command line, output the total count.&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$count&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;if ($c)&amp;#39;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end &amp;#39;end{}&amp;#39;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# end function&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Added ps_grep to global functions.&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;White&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you have any ideas, let me know how I can improve these little
functions.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>My Personal PowerShell Profile</title>
      <link>https://www.thecrosseroads.net/archive/2008/09/my-personal-powershell-profile/</link>
      <pubDate>Mon, 15 Sep 2008 17:09:00 -0400</pubDate>
      
      <guid>https://www.thecrosseroads.net/archive/2008/09/my-personal-powershell-profile/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I&amp;rsquo;ve seen a lot of people post their personal PowerShell profile scripts
online for others to peruse, so I figured I&amp;rsquo;d do the same.  You can also
view the most &lt;a href=&#34;https://bitbucket.org/crosse3/windotfiles/raw/HEAD/powershell/WindowsPowerShell/Microsoft.PowerShell_profile.ps1&#34;&gt;current copy&lt;/a&gt; in my Git repository.&lt;/p&gt;
&lt;p&gt;As is usually the case with things like this, this script is a
work-in-progress. As such, I will try to edit this entry any time I make
a modification to it.&lt;/p&gt;
&lt;p&gt;LAST EDIT 27-May-2010:  Edited this post because there are some things I
just don&amp;rsquo;t do anymore, and updated the script yet again.  If you&amp;rsquo;re
looking for the latest-and-greatest, I would &lt;a href=&#34;https://bitbucket.org/crosse3/windotfiles/raw/HEAD/powershell/WindowsPowerShell/Microsoft.PowerShell_profile.ps1&#34;&gt;check the Git
repo&lt;/a&gt;, because I have a habit of not updating this post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;c&#34;&gt;################################################################################&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# $Id: Microsoft.PowerShell_profile.ps1 196 2010-05-28 01:59:30Z seth $&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# DESCRIPTION:  PowerShell personal profile.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Copyright (c) 2009 Seth Wright (wrightst@jmu.edu)&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# Permission to use, copy, modify, and distribute this software for any&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# purpose with or without fee is hereby granted, provided that the above&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# copyright notice and this permission notice appear in all copies.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# THE SOFTWARE IS PROVIDED &amp;#34;AS IS&amp;#34; AND THE AUTHOR DISCLAIMS ALL WARRANTIES&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;################################################################################&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Add any other paths to search for scripts here.&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;$ExtraScriptPaths&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;~/PowerShellScripts&amp;#34;&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Cyan&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MyInvocation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyCommand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Definition&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Add all registered snapins.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$Snapin&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-PSSnapin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-registered&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Add-PSSnapin&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Snapin&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Added Snapin &amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-NoNewLine&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$Snapin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Green&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;


&lt;span class=&#34;c&#34;&gt;# Loop through the PowerShellScripts folder and execute all .ps1 files.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ScriptFolder&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ExtraScriptPaths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ScriptFolder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nv&#34;&gt;$ScriptFolder&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Resolve-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ScriptFolder&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Executing scripts found in $ScriptFolder...&amp;#34;&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$script&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;dir &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Recurse&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ScriptFolder&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;where &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-like&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;*.ps1&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Executing &amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-NoNewLine&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Red&lt;/span&gt;
            &lt;span class=&#34;p&#34;&gt;&amp;amp;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FullName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Write-Warning&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Script Path &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;$ScriptFolder&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; does not exist.&amp;#34;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;


&lt;span class=&#34;c&#34;&gt;# Allow Unix-like functionality with the &amp;#39;cd&amp;#39; command.&lt;/span&gt;
&lt;span class=&#34;c&#34;&gt;# First, remove the default &amp;#34;cd&amp;#34; alias&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;Alias&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;Alias&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Get-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Env&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UserProfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;Set-Location&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$path&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nv&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RawUI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WindowTitle&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;PowerShell: $pwd&amp;#34;&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;PS&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-NoNewLine&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DarkGreen&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get-location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$nestedpromptlevel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-ge&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;gt;&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Fore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DarkCyan&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-NoNewLine&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Other aliases because I&amp;#39;m lazy.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;npr&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;notepad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exe&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$profile&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Blank line before initial prompt.&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;

&lt;span class=&#34;c&#34;&gt;# Remove any transient variables from the environment.&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Variable&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Snapin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Variable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Snapin&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Variable&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Variable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Variable&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ExtraScriptPaths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Variable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ExtraScriptPaths&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Variable&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ScriptFolder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Remove-Variable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ScriptFolder&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Send me an email or comment or whatnot if you have any questions, or if
you have any suggestions for improvements!&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
