在Powershell中搜索文本中的字符串的问题

时间:2018-01-15 11:14:09

标签: regex powershell scripting backup

我正在构建一个脚本来监控PowerShell中的Ahsay备份,并且遇到了识别备份类型的问题,它通过检查日志文件的前几行中的某些关键字来工作,我希望如此如果它包含单词“文件列表”但也包含单词“数据库”,则它不会记录为文件类型备份 - 下面的代码(变量$ LogType包含正在搜索的文本):

get-childitem -Exclude *Scheduler*, *SystemTray*, *Archived*,*System*| select -last 1 | Get-Content -totalcount 13 -outvariable LogType
if($LogType -notlike "*Database*" -and $LogType -like "*file list*")
{
...
}

返回true,并在搜索的文本为:

时执行if语句
[2018/01/14 19:30:06] [info] Start [ Windows Server 2008 R2 (FS1), AhsayOBM 6.27.0.0 ]
[2018/01/14 19:30:10] [info] Using Temporary Directory C:\Users\systemadmin\.temp
[2018/01/14 19:30:10] [info] Start running pre-commands
[2018/01/14 19:30:10] [info] Finished running pre-commands
[2018/01/14 19:30:11] [info] Start creating Shadow Copy Set ...
[2018/01/14 19:30:21] [info] Shadow Copy Set successfully created Database
[2018/01/14 19:30:21] [info] Downloading server file list ...
[2018/01/14 19:36:44] [info] Downloading server file list ... Completed
[2018/01/14 19:36:45] [info] Reading backup source from hard disk

...

我无法理解为什么会这样,有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

我相信这是PowerShell有点太有帮助的情况。

  1. Get-Content默认输出一个字符串数组,每行一个字符串。

  2. 当与集合一起使用时,比较运算符的工作方式不同,它们将为每个项目评估一次并返回匹配的每个项目。例如

    (0..10) -eq 5

    将返回5

  3. PowerShell将很多内容解释为true,包括一个非空的数组。

  4. 基本上,这两个条件对于文件中的至少一行都是正确的,因此该语句在技术上是正确的。解决问题的最简单方法是将文件作为带有-Raw参数的单个字符串读取。

    $LogType = Get-Content $myFile -Raw -TotalCount 13
    

    修改:如果-Raw-TotalCount无法正常协作,您可以使用-TotalCount并手动合并。

    $fileContent = Get-Content $myFile -TotalCount 13
    $LogType = $fileContent -join [Environment]::NewLine
    

答案 1 :(得分:0)

不确定为什么你的' - 不喜欢'没有工作,但我确定它与你的String的评估方式有关,可能是它是一个字符串数组而不是一个完整的字符串(取决于你如何填充它)。作为临时解决方案,当我在我的机器上尝试或至少作为测试时,您可以尝试嵌套2 if语句?也许是这样的事情:

if($LogType -like "*file list*")
{
   if ($LogType -like "*Database*") {
    ...
   } else {
    ...
   }
}

答案 2 :(得分:0)

使用

进行管理以使其最终正常工作
if($LogType -like "*Database*" -eq $False -and $LogType -like "*file list*")
{
...
}