powershell 尝试将输出转换为数值

lnlaulya  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(124)

尝试从的输出设置powershell监视器的维护模式值
./repcli status
这将返回一个很长的值列表,我将尝试返回维护模式的状态[disabled][enabled]
感兴趣线如下所示,例如:

Maintenance mode = [enabled]

我想确定感兴趣的行包含[enabled]还是[disabled],在前一种情况下返回1,在后一种情况下返回0
我尝试了:

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

这将返回 * all * 输出行,这不是我想要的。

fivyi3re

fivyi3re1#

请尝试以下操作:

# 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只返回 * matching lines *,但注意它并不直接返回,而是将它们 Package 在Microsoft.PowerShell.Commands.MatchInfo示例中,这些示例伴随着.Line属性中的实际行文本,并带有关于匹配的元数据。
  • 通过管道连接到| ForEach Line,或者仅在PowerShell(Core)7+中添加-Raw开关以仅获取 * 行文本 *。
  • 当然,接下来需要检查为感兴趣的子字符串返回的行文本,如上所示。

相关问题