输出 Select-String 上下文所有行值
Output Select-String Context all Line Values
我正在做 Select-String 在一堆 .dco 中找到一个模式
并使用这一行我得到:
PS C:\> gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern
C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:373:MTR150000010010 0 0RA 409347 0100000125000001250000140000NN NNE 000
模式匹配,我得到了那一行。不过,包含我需要的实际数据的那一行在它下面,所以我添加了参数 -Context
PS C:\> gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1
C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:372:CUS150000010010001288502
> C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:373:MTR150000010010 0 0RA 409347 0100000125000001250000140000NN NNE 000
C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:374:RDG15000001KH01R000000000K00000100000000271000012152017000000N000000000000UMETERSENS000000000K 10000000000000000267
我关心的是第3行,但是这3行信息都有用,所以我想导出这个。
这行代码为我提供了我希望输出的数据:
$Found | Select * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel
LineNumber : 373
Line : MTR150000010010 0 0RA 409347 0100000125000001250000140000NN NNE 000
Filename : DCO_CYC15_E_15112017_2.DCO
Path : P:\path\path_DCO17 November\DCO_CYC15_E_15112017_2.DCO
Pattern : 409347
Matches : {0}
但是,那只是 "Line:" 属性 中的匹配行。
如何包含 -Context 中的另外两行?
如果那不可能,我很满意这一行,即 -Context 1 输出的第 3 行:
RDG15000001KH01R000000000K00000100000000271000012152017000000N000000000000UMETERSENS000000000K 10000000000000000267
如果无法获取全部 3 行,如何将其切换为包含在导出中的行数据?
注:
这一切都是在一个循环中完成的。在这种情况下,只有 1 个匹配项,但可以有多个。
$Found = @()
Foreach ($folder in $folders)
{
$Found += gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1
if ($Found) {
$Found | Select * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
$row.Status = "Found in File"
}
}
谢谢,希望你明白我在问什么。
使用计算的 属性 从 Context
属性 中获取第 3 行:
$Found | Select *,@{Name='PostContext';Expression={$_.Context.PostContext}} -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
由于 $Found += ...
语句随后导出到目前为止捕获的所有找到的实例,您当前的循环将导致重复。
$Found = foreach ($folder in $folders) {
Get-ChildItem $folder -Filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1
}
if ($Found) {
$Found | Select *,@{Name='PostContext';Expression={$_.Context.PostContext}} -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
$row.Status = "Found in File"
}
我正在做 Select-String 在一堆 .dco 中找到一个模式 并使用这一行我得到:
PS C:\> gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern
C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:373:MTR150000010010 0 0RA 409347 0100000125000001250000140000NN NNE 000
模式匹配,我得到了那一行。不过,包含我需要的实际数据的那一行在它下面,所以我添加了参数 -Context
PS C:\> gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1
C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:372:CUS150000010010001288502
> C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:373:MTR150000010010 0 0RA 409347 0100000125000001250000140000NN NNE 000
C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:374:RDG15000001KH01R000000000K00000100000000271000012152017000000N000000000000UMETERSENS000000000K 10000000000000000267
我关心的是第3行,但是这3行信息都有用,所以我想导出这个。
这行代码为我提供了我希望输出的数据:
$Found | Select * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel
LineNumber : 373
Line : MTR150000010010 0 0RA 409347 0100000125000001250000140000NN NNE 000
Filename : DCO_CYC15_E_15112017_2.DCO
Path : P:\path\path_DCO17 November\DCO_CYC15_E_15112017_2.DCO
Pattern : 409347
Matches : {0}
但是,那只是 "Line:" 属性 中的匹配行。 如何包含 -Context 中的另外两行?
如果那不可能,我很满意这一行,即 -Context 1 输出的第 3 行:
RDG15000001KH01R000000000K00000100000000271000012152017000000N000000000000UMETERSENS000000000K 10000000000000000267
如果无法获取全部 3 行,如何将其切换为包含在导出中的行数据?
注: 这一切都是在一个循环中完成的。在这种情况下,只有 1 个匹配项,但可以有多个。
$Found = @()
Foreach ($folder in $folders)
{
$Found += gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1
if ($Found) {
$Found | Select * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
$row.Status = "Found in File"
}
}
谢谢,希望你明白我在问什么。
使用计算的 属性 从 Context
属性 中获取第 3 行:
$Found | Select *,@{Name='PostContext';Expression={$_.Context.PostContext}} -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
由于 $Found += ...
语句随后导出到目前为止捕获的所有找到的实例,您当前的循环将导致重复。
$Found = foreach ($folder in $folders) {
Get-ChildItem $folder -Filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1
}
if ($Found) {
$Found | Select *,@{Name='PostContext';Expression={$_.Context.PostContext}} -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
$row.Status = "Found in File"
}