2017-06-21 191 views
1

我有一段代码在一系列日志文件中寻找字符串。Powershell问题while while循环

如果找到字符串,它应该退出循环(嵌套在另一个循环内的功能的一部分)以$ buildlogsuccess =“真”

如果无法找到字符串,它应该退出,返回$ buildlogsuccess =“假”

的选择字符串语句本身的工作原理,但它看起来像有什么毛病下面的代码:

 $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'。

重新测试通过手动填充$日志(与具有该字符串的文件)和$ buildstring并获得“真”如预期使用

[布尔](选择串-path $当[bool](select-string -path $log -simplematch $buildstring)登录-simpleMatch $ buildstring)

注:变量它使用:

$ buildstring =“包 “F:\ XXX \引导程序\ apackage \ Installsomething。 xml'已成功处理 “

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

回答

1

Do-while首先会做的事情,然后检查while声明。您正在迭代n文件。它在执行该部分之前不会检查$count的值。

所以,假设第一个文件不包含您正在查找的字符串。它将(正确地)将$count变量减为零,然后它将转到$logArr中的下一个$log

现在对于文件夹中的每个下一个文件,它将递减$count,然后当它看到$count不大于0时退出循环。

我不知道为什么你正在使用的do-while循环的一切都在这里

0

感谢挪威

我过分复杂的自己。

这工作:

 $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} 
     } 
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