【发布时间】:2022-01-18 18:20:44
【问题描述】:
我正在尝试从文档中解析几个重复的组(对于每个案例陈述,我需要 stprintf 中的数字(例如 8000),它后面的描述(例如 Comm Err 05 - 超时发送命令) ,以及严重性(警告或致命)。由于某种原因,结果是空的。我看了这个match and nomatch,我想我正在做他们正在做的事情。有人看到我的问题,或者有任何其他建议吗?
#Function to get needed contents from case statements in $parsedCaseMethod provided
Function Get-CaseContents{
[cmdletbinding()]
Param ( [string]$parsedCaseMethod, [string]$parseLinesGroupIndicator)
Process
{
Write-Host "This is what I'm dealing with people" -ForegroundColor Green
Write-Host $parsedCaseMethod
#parse the case data out:
#ex from code:
#case kRESULT_STATUS_PPA_Comm_Timeout: #_stprintf is parseLinesGroupIndicator
# _stprintf( outDevStr, _T("8005 - (Comm. Err 05) - %s(Timeout sending command)"), errorStr);
# outError = INVALID_PARAM;
# outSeverity = CCA_WARNING;
$regex = [regex]"\((.*)\)" #sdkErr
$severity = [regex]"[\s\S.=;]*outSeverity[\s\S]*=[\s\Sa-zA-Z]*_(a-zA-Z)*" #severity warning or error etc
$parsedCaseMethod -match '$parseLinesGroupIndicator[\s\S]*(?<sdkErr>\d*)[\s\S-]*(?<sdkDesc>$regex)(?<sdkSeverity>$severity)'
Write-Output "sdkErr:"
$Matches.sdkErr
Write-Output "sdkDesc:"
$Matches.sdkDesc
Write-Output "sdkSeverity:"
$Matches.sdkSeverity
}#End of Process
}#End of Function
#main code
...
#call method to get case info
Get-CaseContents -parsedCaseMethod $matchFound -parseLinesGroupIndicator "_stprintf" #need to get returned info back
$matchFound 内容的示例包括:
...
case kRESULT_STATUS_Undefined_Opcode:
_stprintf( outDevStr, _T("8004 - (Comm. Err 04) - %s(Undefined Opcode)"), errorStr);
outError = INVALID_PARAM;
outSeverity = CCA_WARNING;
break;
case kRESULT_STATUS_Comm_Timeout:
_stprintf( outDevStr, _T("8005 - (Comm. Err 05) - %s(Timeout sending command)"), errorStr);
outError = INVALID_PARAM;
outSeverity = CCA_WARNING;
break;
case kRESULT_STATUS_TXD_Failed:
_stprintf( outDevStr, _T("8006 - (Comm. Err 06) - %s(TXD Failed--Send buffer overflow.)"), errorStr);
outError = INVALID_PARAM;
outSeverity = CCA_WARNING;
break;
...
如果找到的三个变量在一个数组中就可以了,所以从函数中返回它们更容易,但我还没有达到这一点。
对于方法 print 语句,它显示如上的字符串内容,然后是以下空输出:
bool
False
sdkErr:
sdkDesc:
sdkSeverity:
我原以为它最终会返回(我意识到我没有收集这个的数组,但可能是最后一组的信息): sdkErr: 8004, sdkDesc: (Comm. Err 04) - %s(Undefined Opcode), sdkSeverity: 警告
sdkErr: 8005, sdkDesc: (Comm. Err 05) - %s(超时发送命令), sdkSeverity: 警告
sdkErr: 8006, sdkDesc: (Comm. Err 06) - %s(TXD Failed--Send buffer overflow.), sdkSeverity: 警告
这是 PowerShell 5.1。如果有人有任何建议,将不胜感激!
更新: 我尝试更新输入字符串,所以我确切地知道它正在解析什么,并且它只解析一个 case 语句。它仍然没有返回 sdkErr 以及它打印的其他内容。我觉得没问题。我不确定我错过了什么。我正在查看backticks 并决定我需要在我硬编码的子字符串中使用反引号等,因为我在我拉出测试的字符串中得到“输入字符串格式不正确”。在下面的更改中,我将参数重新定义为较小的字符串以进行测试,并修改了我的正则表达式以进行测试,因为我之前的内容不起作用。
#Function to get needed contents from case statements in $parsedCaseMethod provided
Function Get-CaseContents{
[cmdletbinding()]
Param ( [string]$parsedCaseMethod, [string]$parseLinesGroupIndicator)
Process
{
#Write-Host "This is what I'm dealing with people" -ForegroundColor Green
#Write-Host $parsedCaseMethod
#parse the case data out:
#ex from code:
#case kRESULT_STATUS_Comm_Timeout: #_stprintf is parseLinesGroupIndicator
# _stprintf( outDevStr, _T("8005 - (Comm. Err 05) - %s(Timeout sending command)"), errorStr);
# outError = INVALID_PARAM;
# outSeverity = CCA_WARNING;
$parseCaseMethod = "case kRESULT_STATUS_Comm_Timeout:
_stprintf( outDevStr, _T(`"8005 - (Comm. Err 05) - %s(Timeout sending command)`"), errorStr);
outError = INVALID_PARAM;
outSeverity = CCA_WARNING;"
$regexNum = [regex]"$parseLinesGroupIndicator[\s\S.]*_T[.*](0-9)*"
$regex = [regex]"\((.*)\)" #sdkErr
$severity = [regex]"[\s\S.=;]*outSeverity[\s\S]*=[\s\Sa-zA-Z]*_(a-zA-Z)*" #severity warning or error etc
##$parsedCaseMethod -match "$parseLinesGroupIndicator[\s\S]*(?<sdkErr>\d*)[\s\S-]*(?<sdkDesc>$regex)(?<sdkSeverity>$severity)"
$parsedCaseMethod -match "$regexNum(?<sdkErr>\d*)[\s\S-]*(?<sdkDesc>$regex)(?<sdkSeverity>$severity)"
Write-Output "sdkErr:"
$Matches.sdkErr
Write-Output "sdkDesc:"
$Matches.sdkDesc
Write-Output "sdkSeverity:"
$Matches.sdkSeverity
}#End of Process
}#End of Function
更新 2: 我正在玩一个正则表达式编辑器regex101.com,它与我为 $regexNum 显示的内容相匹配,但由于某种原因,当我打印 $Matches.sdkErr 时它没有返回我所期望的内容。我不确定我是否因为编辑器将 8000 部分显示为一个组,并且有不同的方式来获取它。我尝试了 $Matches.sdkErr.Group(1) 但得到了这个错误
Method invocation failed because [System.String] does not contain a method named 'Group'.
这是代码更改(大部分更改在 $regexNum 中):
#Function to get needed contents from case statements in $parsedCaseMethod provided
Function Get-CaseContents{
[cmdletbinding()]
Param ( [string]$parsedCaseMethod, [string]$parseLinesGroupIndicator)
Process
{
#Write-Host "This is what I'm dealing with people" -ForegroundColor Green
#Write-Host $parsedCaseMethod
#parse the case data out:
#ex from code:
#case kRESULT_STATUS_PPA_Comm_Timeout: #_stprintf is parseLinesGroupIndicator
# _stprintf( outDevStr, _T("8005 - (Comm. Err 05) - %s(Timeout sending command)"), errorStr);
# outError = INVALID_PARAM;
# outSeverity = CCA_WARNING;
$parsedCaseMethod = "case kRESULT_STATUS_Comm_Timeout:
_stprintf( outDevStr, _T(`"8005 - (Comm. Err 05) - %s(Timeout sending command)`"), errorStr);
outError = INVALID_PARAM;
outSeverity = CCA_WARNING;"
##$regexNum = [regex]"$parseLinesGroupIndicator[\s\Sa-zA-Z]*(0-9)*"
$regexNum = [regex]"$parseLinesGroupIndicator[\s\Sa-zA-Z]*_T[^[0-9]]*.+?([0-9][0-9]*)"
# \s\S\(`",a-zA-Z.]*_T[.*](0-9)*
$regex = [regex]"\((.*)\)" #sdkErr
$severity = [regex]"[\s\S.=;]*outSeverity[\s\S]*=[\s\Sa-zA-Z]*_(a-zA-Z)*" #severity warning or error etc
#$parsedCaseMethod -match "$parseLinesGroupIndicator[\s\S]*(?<sdkErr>\d*)[\s\S-]*(?<sdkDesc>$regex)(?<sdkSeverity>$severity)"
#$parsedCaseMethod -match "$regexNum(?<sdkErr>\d*)[\s\S-]*(?<sdkDesc>$regex)(?<sdkSeverity>$severity)"
$parsedCaseMethod -match "(?<sdkErr>$regexNum)[\s\S-]*(?<sdkDesc>$regex)(?<sdkSeverity>$severity)"
Write-Output "sdkErr:"
$Matches.sdkErr.Group(1) #error message...with $Matches.sdkErr it prints entire Match and not just the part in parenthesis that I want (8000)
Write-Output "sdkDesc:"
$Matches.sdkDesc
Write-Output "sdkSeverity:"
$Matches.sdkSeverity
}#End of Process
}#End of Function
我也在看这个string in text file
【问题讨论】:
-
$parsedCaseMethod -match '...'行上有单引号,因此变量不会被扩展。如果将它们换成双引号,该功能似乎可以正常工作。正则表达式本身可能需要一些工作,但我不确定您要从每个匹配组中寻找什么结果。 -
@Cpt.Whale 带有双引号,它为 sdkErr 返回空白,我正在尝试使用上面的 Update 修复它,但仍然找不到 sdkErr。
-
@Cpt.Whale 切换到双引号是个好主意。这确实有点帮助,但它仍然没有像 8000 一样返回 sdkErr。
-
这真的是minimal reproducible example吗? ..
标签: regex powershell