试图将输出转换为数值



尝试从
./repcli status:

的输出设置维护模式值的powershell监视器这返回一长串值,我试图返回维护模式的状态为[disabled][enabled]

感兴趣的行看起来像这样,例如:

Maintenance mode = [enabled]

我想确定感兴趣的行是否包含[enabled][disabled],并在前一种情况下返回1,在后者返回0

What I tried:

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

返回所有输出行,这不是我想要的。

尝试如下:

# 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

注意-match操作符的使用,由于它是基于regex的,因此需要用转义[]才能按字面意思使用。Select-String也使用正则表达式,除非你传递-SimpleMatch


至于你试过的:

  • Out-String(没有-Stream)返回一个单个字符串,包含./repcli.exe调用输出的所有行。

  • 因此,如果Select-String找到匹配,它将返回整个字符串,而不仅仅是找到模式的行。

  • 您可以通过简单地省略Out-String调用来避免这个问题,因为PowerShell会自动地逐行中继对外部程序调用的输出行

  • 虽然Select-String只返回匹配的行,但请注意,它并没有直接这样做,而是将它们包装在Microsoft.PowerShell.Commands.MatchInfo实例中,这些实例伴随着实际的行文本,在属性.Line中,带有关于匹配的元数据。

    • 管道到| ForEach Line,或者在PowerShell (Core) 7+中,添加-Raw开关以仅获取行文本
  • 当然,您需要检查返回的子字符串的行文本,如上所示。

最新更新