我需要捕获每一行包含"*"在鉴定科和环境科之间的位置7。所有其他数据都可以忽略,一旦我点击环境分区,我就可以退出文件。
鉴定科和环境科都从位置8开始。
这是我的数据的一个例子
IDENTIFICATION DIVISION.
**************************************************************** 00000700
**************************************************************** 00000800
* PURPOSE: TO PERFORM THE I/O LOGIC TO RETRIEVE THE CREDITING * 00000900
* AGENTS FOR THE SPLIT AGREEMENTS FOR A CUSTOMER * 00001000
* OR TERRITORY. * 00001100
* CUSTOMIZED VERSION OF ADMLR301 FOR MONTHLY DST * 00001110
* PROCESS-AAGYZ105. * 00001110
**************************************************************** 00001300
ENVIRONMENT DIVISION.
下面是@Olaf的代码。我添加了创建添加和关闭excel电子表格的逻辑。工作好!
谢谢你@雪宝!!$excel = New-Object -ComObject excel.application
$excel.visible = $False
$workbook = $excel.Workbooks.Add()
$diskSpacewksht= $workbook.Worksheets.Item(1)
$diskSpacewksht.Name = "CAPTURE"
$col1=3
$diskSpacewksht.Cells.Item(2,8) = 'Header - Deletes'
$diskSpacewksht.Cells.Item(3,1) = 'Program'
$diskSpacewksht.Cells.Item(3,2) = 'Description'
$CBLFileList = Get-ChildItem -Path 'C:TEMP' -Filter '*.cbl' -File -Recurse
$Flowerbox = @()
ForEach($CBLFile in $CBLFileList) {
Write-Host "Processing ... $CBLFile" -foregroundcolor green
Get-content -Path $CBLFile.FullName |
ForEach-Object {
if ($_ -match 'IDENTIFICATION DIVISION') {
$treat = $true
}
if ($_ -match 'ENVIRONMENT DIVISION') {
$col1++
$diskSpacewksht.Cells.Item($col1,1) = $CBLFile
$diskSpacewksht.Cells.Item($col1,2) = [String]$Flowerbox
$Flowerbox = @()
continue
}
if ($treat) {
if ($_ -match '*(.{60})') {
Foreach-Object {$Flowerbox += $matches[1] + "`r`n"}
}
}
}
}
$excel.DisplayAlerts = 'False'
$ext=".xlsx"
$path="C:MISCCAPTURE$ext"
$workbook.SaveAs($path)
$workbook.Close
$excel.DisplayAlerts = 'False'
$excel.Quit()
如果您的输入文件始终具有您在代码片段中显示的格式,那么您的任务可能比您想象的要容易:;-)
$CBLFileList =
Get-ChildItem -Path 'D:sample' -Filter '*.cbl' -File -Recurse
$output =
ForEach($CBLFile in $CBLFileList) {
Get-content -Path $CBLFile.FullName |
ForEach-Object {
if ($_ -match 'IDENTIFICATION DIVISION') {
$treat = $true
}
if ($_ -match 'ENVIRONMENT DIVISION.') {
continue
}
if ($treat) {
if ($_ -match '*s(.{60})') {
[PSCustomObject]@{
Path = $CBLFile.FullName
Catch = $Matches[1]
}
}
}
}
}
$output
代码忽略输入文件的所有行,直到遇到第一行带有'IDENTIFICATION DIVISION'的行,然后解析所有行,直到遇到第一行带有'ENVIRONMENT DIVISION'的行。
应该输出你想要的结果。我只是觉得把它传输到CSV文件不是个好主意。
正则表达式正在查找一些任意字符,在单个星号后面跟着一个或多个空格,然后再跟着一个或多个空格后面跟着一个星号。
这个怎么样?
Clear-Host
$StringData = '
IDENTIFICATION DIVISION.
**************************************************************** 00000700
**************************************************************** 00000800
* PURPOSE: TO PERFORM THE I/O LOGIC TO RETRIEVE THE CREDITING * 00000900
* AGENTS FOR THE SPLIT AGREEMENTS FOR A CUSTOMER * 00001000
* OR TERRITORY. * 00001100
* CUSTOMIZED VERSION OF ADMLR301 FOR MONTHLY DST * 00001110
* PROCESS-AAGYZ105. * 00001110
**************************************************************** 00001300
ENVIRONMENT DIVISION.
'
[regex]::Match($StringData, '(?is)(?<=bIDENTIFICATION DIVISIONb.).*?(?=bENVIRONMENT DIVISIONb)').Value
# Results
<#
**************************************************************** 00000700
**************************************************************** 00000800
* PURPOSE: TO PERFORM THE I/O LOGIC TO RETRIEVE THE CREDITING * 00000900
* AGENTS FOR THE SPLIT AGREEMENTS FOR A CUSTOMER * 00001000
* OR TERRITORY. * 00001100
* CUSTOMIZED VERSION OF ADMLR301 FOR MONTHLY DST * 00001110
* PROCESS-AAGYZ105. * 00001110
**************************************************************** 00001300
#>