2017-06-21 185 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