1

如何在两个单词之间提取文本?我知道正则表达式可以做到这一点,我一直在环顾四周,但我尝试的代码根本不适合我......就像正则表达式的砖头一样无能为力......所以可能做错了......

我有一个文本文件,想查询这些文本字符串之间显示的任何内容:

[问题设备]

设备 PNP 设备 ID 错误代码

[USB]

我试过这样做,但无处可去!

$devices = Get-Content c:\temp\dev.txt | out-string [regex]::match($devices,'(?<=\<Problem Devices\>).+(?=\<USB\>)',"singleline").value.trim()

You cannot call a method on a null-valued expression.
At line:1 char:141
+ $devices = Get-Content c:\temp\dev.txt | out-string [regex]::match($devices,'(?<=\<Problem Devices\>).+(?=\<USB\>)',"
singleline").value.trim <<<< ()
    + CategoryInfo          : InvalidOperation: (trim:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
4

2 回答 2

1

out-string不需要管道;get-content将文件的每一行作为单独的对象发送到管道中。所以你想用foreach-object.

$devices = Get-Content c:\temp\dev.txt | foreach-object{[regex]::match($devices,'(?<=\<Problem Devices\>).+(?=\<USB\>)',"singleline").value.trim()}

但是,您仍然会遇到尝试对象的问题trim()-null如果您的正则表达式匹配未找到匹配项,则无法调用value.trim().

当您<Problem Devices>的输入文件具有[Problem Devices].

与其尝试在一组管道步骤中完成所有事情,不如分解您的问题:

  1. 对于文件中的每一行,检查 [Problem Devices]
  2. 对于后续的每一行,如果是[USB],则退出循环。如果不是 [USB],则将每一行捕获到一个变量中(构建这些行的数组)
  3. 在循环之后,迭代您刚刚构建的数组的每个元素以解析出每个值(创建一个集合PSObjects(每个设备一个),或一个哈希集合(每个设备一个),具体取决于您的需要)。
于 2013-01-02T17:11:38.980 回答
0

如果您对正则表达式不满意,还有其他方法:

$测试 = $假

$devices = 获取内容文件.txt |

foreach {

if ($_.trim() -eq '[Problem Devices]'){$test = $true}

elseif ($_.trim() -eq '[USB]') {$test = $false}

elseif ($test){$_}

} | where {$_.trim()}
于 2013-01-04T04:31:58.657 回答