我有一些简单的代码可以在一系列日志文件中查找字符串。
如果找到字符串,它应该退出循环(嵌套在另一个循环中作为函数的一部分),使用$ buildlogsuccess ='True'
如果找不到字符串,则应退出并返回$ buildlogsuccess ='False'
select-string语句本身有效,但看起来下面的代码有问题:
$logArr = gci C:\build\Logs | where {($_.name -like 'install*.log') -and (! $_.PSIsContainer)} | select -expand FullName
$count = ($logArr).count
Foreach ($log in $logArr) {
Do {
$count -= 1
$buildlogsuccess = [bool](select-string -path $log -simplematch $buildstring)
If (($buildlogsuccess)) {break}
} while ($count -gt '0')
}
当其中一个日志包含字符串时,循环结束并应将$ buildlogsuccess作为“True”返回。
如果我检查$ log,它会显示我知道的有字符串的文件(在本例中为C:\ build \ Logs \ Installer1.log)。
奇怪的是,此时$ count显示的值为-1?
如果我从该文件中取出该字符串并再次运行它也会退出并返回正确的变量值(并将$ log变量显示为$ logArr中的最后一个文件,如此预期),但这次$ count显示为 - 24。
当其中一个日志文件中存在字符串时,我的代码也将$ buildlogsuccess返回为'False'。
通过手动填充$ log(包含具有该字符串的文件)和$ buildstring重新测试[bool](select-string -path $log -simplematch $buildstring)
,并在使用
[bool](select-string -path $ log -simplematch $ buildstring)
注意:它使用的变量:
$ buildstring =“包 已处理'F:\ xxx \ Bootstrap \ apackage \ Installsomething.xml' 成功“
任何帮助确定我出错的地方都将不胜感激。
答案 0 :(得分:2)
您的代码可以大大简化:
$buildlogsuccess = Select-String -SimpleMatch -Quiet $buildstring C:\build\Logs\install*.log
以上假设没有匹配install*.log
的目录;如果有可能,请将Get-ChildItem -File C:\build\Logs -Filter install*.log
的输出转换为Select-String
。
答案 1 :(得分:1)
Do-while
将首先执行此操作,然后检查while
语句。您正在迭代n
个文件。它在执行该部分之前不会检查$count
的值。
因此,假设第一个文件不包含您要查找的字符串。它会(正确地)将$count
变量减少为零,然后继续移动到$log
中的下一个$logArr
。
现在对于文件夹中的每个下一个文件,它将递减$count
,然后在看到$count
不大于0时退出循环。
我不知道为什么你在这里使用do-while
循环
答案 2 :(得分:0)
感谢Norsk
我为自己过度复杂。
这有效:
$logArr = gci C:\build\Logs | where {($_.name -like 'install*.log') -and (! $_.PSIsContainer)} | select -expand FullName
$count = ($logArr).count
Foreach ($log in $logArr) {
$buildlogsuccess = [bool](select-string -path $log -simplematch $buildstring)
If ($buildlogsuccess) {break}
}