Pow whilehell问题与while while循环

时间:2017-06-21 02:23:47

标签: powershell

我有一些简单的代码可以在一系列日志文件中查找字符串。

如果找到字符串,它应该退出循环(嵌套在另一个循环中作为函数的一部分),使用$ 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。

当其中一个日志文件中存在字符串时,我的代码也将$ b​​uildlogsuccess返回为'False'。

通过手动填充$ log(包含具有该字符串的文件)和$ buildstring重新测试[bool](select-string -path $log -simplematch $buildstring),并在使用

时按预期获得'True'
  

[bool](select-string -path $ log -simplematch $ buildstring)

注意:它使用的变量:

  

$ buildstring =“包   已处理'F:\ xxx \ Bootstrap \ apackage \ Installsomething.xml'   成功“

任何帮助确定我出错的地方都将不胜感激。

3 个答案:

答案 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}
        }