尝试从./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
开关以仅获取行文本。
- 管道到
当然,您需要检查返回的子字符串的行文本,如上所示。