Home > Enterprise >  attempting to convert an output into a numeric value
attempting to convert an output into a numeric value

Time:01-11

Trying to setup a powershell monitor for maintenance mode value from the output of
./repcli status:

This returns a long list of values and I'm trying to return the status for maintenance mode being [disabled] or [enabled]

The line of interest looks like this, for example:

Maintenance mode = [enabled]

I'd like to determine whether the line of interest contains [enabled] or [disabled], and return 1 in the former case, 0 in the latter.

What I tried:

./repcli.exe status | out-string | select-string -pattern 'maintenance'

This returns all output lines, which is not what I want.

CodePudding user response:

Try the following:

# In the output from ./repcli.exe status, extract the line that contains
# substring 'maintenance' and see if it contains substring '[enabled]'
# Note: In PSv7 , you can replace '| ForEach Line' with '-Raw'
$enabled = 
  (./repcli.exe status | Select-String maintenance | ForEach Line) -match '\[enabled\]'

# Map the enabled status to 1 ($true) or 0 ($false)
return [int] $enabled

Note the use of the -match operator, which, due to being regex-based, requires escaping [ and ] with \ in order to be used literally. Select-String too uses regexes, except if you pass -SimpleMatch.


As for what you tried:

  • Out-String (without -Stream) returns a single string, comprising all the lines output by your ./repcli.exe call.

  • Therefore, if Select-String finds a match, it returns the entire string, not just the line on which the pattern is found.

  • You can avoid that problem by simply omitting the Out-String call, given that PowerShell automatically relays output lines from calls to external programs line by line.

  • While Select-String then only returns matching lines, note that it doesn't do so directly, but wraps them in Microsoft.PowerShell.Commands.MatchInfo instances that accompany the actual line text, in property .Line, with metadata about the match.

    • Pipe to | ForEach Line or, in PowerShell (Core) 7 only, add the -Raw switch to get only the line text.
  • Of course, you then need to examine the line text returned for the substring of interest, as shown above.

  • Related