我完全不确定我做错了什么,我正在运行manage-bde(返回bitlocker加密状态的命令行)并将其管道到select-string以捕获特定的加密百分比/具有非常具体的正则表达式的状态。选择字符串由于某种原因返回整行,但是一个名为“Matches”的属性返回我需要的EXACT信息,但它是一个Matchinfo对象。有一个名为ToString的方法,但它根本不返回我需要的东西,似乎是对象信息。我只希望字符串格式的输出显示在写入进度gui。
注意:对PowerShell来说仍然很新。
$act = Invoke-Expression -Command "manage-bde -status C:" | select-string -Pattern "(?<=(Percentage Encrypted:)).*" | Select-Object -Property Matches -Last 1
$act.toString()| Out-Host
答案 0 :(得分:2)
Powershell的一个设计原则是,大多数东西都可以被视为一个对象(与其他管理脚本语言中的文本相对)。由于manage-bde不是Powershell工具(而是一个普通的'命令行工具),因此它不像PS那样为PS工作。在BitLocker的情况下,有十几个PS cmdlet。特别是Get-BitLockerVolume
听起来像是近似等同于manage-bde -status
但是,如果您想坚持使用manage-bde,则可以使用out-string
cmdlet从对象生成字符串输出。所以以下可能是你想要的。
$act = Invoke-Expression -Command "manage-bde -status C:" |
select-string -Pattern "(?<=(Percentage Encrypted:)).*" |
Select-Object -Property Matches -Last 1 |
out-string
$act| Out-Host
答案 1 :(得分:2)
您可以使用以下内容制作几乎任何字符串:
[string](code_to_be_parsed)
我可以从ping
命令创建一个字符串数组:
$test = [string[]](ping google.com)
这给了我结果:
# empty line
Pinging google.com [74.125.200.101] with 32 bytes of data:
Reply from 74.125.200.101: bytes=32 time=302ms TTL=36
Reply from 74.125.200.101: bytes=32 time=302ms TTL=36
Reply from 74.125.200.101: bytes=32 time=302ms TTL=36
Reply from 74.125.200.101: bytes=32 time=306ms TTL=36
Ping statistics for 74.125.200.101:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 302ms, Maximum = 306ms, Average = 303ms
当我执行$test.count
时,它返回11,这实际上是行的确切行数,每行都是数组内的字符串。
答案 2 :(得分:1)
MatchInfo对象可能令人困惑。试试这个:
$act = Invoke-Expression -Command "manage-bde -status C:" |
select-string -Pattern "(?<=(Percentage Encrypted:)).*" |
Select-Object -Property Matches -Last 1
$act.matches[0].value
可替换地:
(manage-bde -status C:) -match '^\s+Percentage Encrypted:' -replace '\D+(\d+%)','$1'
答案 3 :(得分:0)
我的答案基于vasili syrakis的帖子。到了此页面,并给出了与OP相关的确切问题。
$encryptionstatus = [string[]](manage-bde -status c:)
$encryptionstatus[9] | Out-Host