从Powershell输出Search-String中提取单词

时间:2018-10-05 02:33:14

标签: powershell

嗨,我正在尝试从文本输出中提取一个单词。这应该很容易,但是我已经花了很多时间了。现在,我可以提取一行,而不仅仅是单词。

例如

w32tm /query /status | Select-String -pattern "CMOS"

输出行 “来源:本地CMOS时钟”

我只想提取“本地CMOS时钟”

$var1=w32tm /query /status | Select-String -pattern "CMOS"

$var2=($var1 -split ':')[1] | Out-String

我能够提出上述建议,但似乎行得通。我不确定是否有更好的方法,我试图通过对/错进行评估,尽管看起来总是正确 例如

if($var2 = "Local CMOS Clock"){
Write-Output "True";
}Else{
Write-Output "False";
}

始终为真:即使条件不正确

提前谢谢。

2 个答案:

答案 0 :(得分:0)

我不确定您的动机,但这是获得所需答案的一种更简洁的方法:

构建包含输出的PSObject

PSObject将包含w32tm的输出。该代码通过循环输出命令输出来工作,首先我们创建一个HashTable,然后将其用于构建易于操作的PowerShell对象:

# Pipe the w32tm command through a foreach
# Build a hashtable object containing the keys
# $_ represents each entry in the command output, which is then split by ':'
$w32_obj = w32tm /query /status | ForEach-Object -Begin {$w32_dict = @{}} -Process {
    # Ignore blank entries
    if ($_ -ne '') {
        $fields = $_ -split ': '
        # This part sets the elements of the w32_dict. 
        # Some rows contain more than one colon, 
        # so we combine all (except 0) the split output strings together using 'join'
        $w32_dict[$fields[0]] = $($fields[1..$($fields.Count)] -join ':').Trim()
    }
} -End {New-Object psobject -Property $w32_dict}

查看PSObject

只需运行以下命令即可显示已创建的新PSObject:

$w32_obj

现在检查“源”

现在,我们可以通过使用点符号$w32_obj$w32_obj.Source中请求“源”对象:

if($w32_obj.Source -eq "Local CMOS Clock"){
Write-Output "True";
}Else{
Write-Output "False";
}

进一步阅读

这显示了从HashTable到PSobject的转换,反之亦然

PSCustomObject to Hashtable

答案 1 :(得分:0)

这是从w32tm获取错误/真实的另一种方法。我的系统在输出中没有“ cmos”,因此我使用“系统时钟”,但是这个想法将适合您的情况。

[bool]((w32tm /query /status) -match 'system clock')

以上内容在我的系统上返回了$True。这似乎比您使用的方法更直接。 [咧嘴]

保重,