Public/Test-ALHIsOnBattery.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<#PSScriptInfo
 
.VERSION 1.0.2
 
.GUID 4792f402-84a6-4418-9dd4-7145433dd58b
 
.AUTHOR Dieter Koch
 
.COMPANYNAME
 
.COPYRIGHT (c) 2021-2023 Dieter Koch
 
.TAGS
 
.LICENSEURI https://github.com/admins-little-helper/ALH/blob/main/LICENSE
 
.PROJECTURI https://github.com/admins-little-helper/ALH
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    1.0
    Initial release
 
    1.0.1
    - Fixed issue with parameter TargetName for cmdlet Test-Connection when running on PowerShell version < 7.
    Using parameter name "-ComputerName" which works on PowerShell 5 and older and is also available as alias
    on PowerShell version 7 for the cmdlet Test-Connection.
 
    1.0.2
    - Fixed issue with parameter Ping for cmdlet Test-Connection when running on PowerShell verion < 7.
    The parameter "Ping" was introduced for the cmdlet Test-Connection in PowerShell 7.x and therefore is unknown in older versions of PowerShell.
    Removed this parameter in this function as the default behaviour of the Test-Connection cmdlet is to do a ping.
 
#>



<#
 
.DESCRIPTION
 Contains a function to check if a computer is running on battery.
 
#>



Function Test-ALHIsOnBattery {
    <#
    .SYNOPSIS
    Checks if a computer is running on battery.
 
    .DESCRIPTION
    Checks if a computer is running on battery.
 
    .PARAMETER ComputerName
    The name of the computer to check. Defaults to local computer.
 
    .EXAMPLE
    Test-ALHIsOnBattery
 
    ComputerName IsOnBattery ComputerOnline TestStatus Error
    ------------ ----------- -------------- ---------- -----
    MYCOMPUTER True NO_BATTERY_DETECTED None
 
    Check if local computer is running on battery.
 
    .EXAMPLE
    Test-ALHIsOnBattery -ComputerName "Computer1","Computer2"
 
    ComputerName IsOnBattery ComputerOnline TestStatus Error
    ------------ ----------- -------------- ---------- -----
    COMPUTER1 True True SUCCESS None
    COMPUTER2 False True SUCCESS None
 
    Check if computer1 and computer2 is running on battery.
 
    .INPUTS
    System.String for parameter 'ComputerName'
 
    .OUTPUTS
    System.Boolean
 
    .NOTES
    Author: Dieter Koch
    Email: diko@admins-little-helper.de
 
    .LINK
    https://github.com/admins-little-helper/ALH/blob/main/Help/Test-ALHIsOnBattery.txt
    #>


    [OutputType([PSCustomObject])]
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [string[]]
        $ComputerName = $env:COMPUTERNAME
    )

    process {
        foreach ($SingleComputer in $ComputerName) {
            $ComputerOnline = $false
            $ErrorMessage = "None"

            # Set parameters for the 'Get-CimClass' and 'Get-CimInstance' cmdlet.
            $GetCimParams = @{
                ClassName   = 'BatteryStatus'
                Namespace   = 'root/wmi'
                ErrorAction = 'Stop'
            }

            if ($SingleComputer -eq $env:COMPUTERNAME) {
                Write-Verbose -Message "Skipping connection test for local computer."
                $ComputerOnline = $true
            }
            else {
                Write-Verbose -Message "Testing if computer is online: '$SingleComputer'"
                $ComputerOnline = Test-Connection -ComputerName $SingleComputer -Count 2 -Quiet -ErrorAction SilentlyContinue

                # Set also the 'ComputerName' parameter for the Get-CimInstance cmdlet because we're running against a remote computer.
                $GetCimParams.ComputerName = $SingleComputer
            }

            if ($ComputerOnline) {
                Write-Verbose -Message "Checking batttery status for computer: '$SingleComputer'"

                try {
                    Get-CimClass @GetCimParams
                }
                catch [Microsoft.Management.Infrastructure.CimException] {
                    if ($_.Exception -eq "Not found") {
                        Write-Verbose -Message "System does not have a battery."
                    }
                }
                catch {
                    $_
                }

                try {
                    $CheckResult = Get-CimInstance @GetCimParams
                }
                catch {
                    $ErrorMessage = $_.Exception.Message
                }
            }
            else {
                Write-Warning -Message "Computer is not reachable: '$SingleComputer'"
            }

            $Result = [PSCustomObject]@{
                ComputerName   = $SingleComputer
                IsOnBattery    = if ($null -ne $CheckResult) {
                    !$CheckResult.PowerOnline
                }
                else {
                    $null
                }
                ComputerOnline = [bool]$ComputerOnline
                TestStatus     = if ($null -ne $CheckResult) {
                    "SUCCESS"
                }
                else {
                    "NO_BATTERY_DETECTED"
                }
                Error          = $ErrorMessage
            }

            $Result
        }
    }
}

#region EndOfScript
<#
################################################################################
################################################################################
#
# ______ _ __ _____ _ _
# | ____| | | / _| / ____| (_) | |
# | |__ _ __ __| | ___ | |_ | (___ ___ _ __ _ _ __ | |_
# | __| | '_ \ / _` | / _ \| _| \___ \ / __| '__| | '_ \| __|
# | |____| | | | (_| | | (_) | | ____) | (__| | | | |_) | |_
# |______|_| |_|\__,_| \___/|_| |_____/ \___|_| |_| .__/ \__|
# | |
# |_|
################################################################################
################################################################################
# created with help of http://patorjk.com/software/taag/
#>

#endregion