【问题标题】:Search Variable for String then Run Conditional Statement in PowerShell在 PowerShell 中搜索字符串变量然后运行条件语句
【发布时间】:2011-08-18 15:57:03
【问题描述】:

我对 PowerShell 很陌生。我最近的任务是制作一个错误消息弹出窗口,帮助本地用户确定 MS SQL 按需数据库合并是否有效。我写了一个脚本,它会执行以下操作:

  • 运行执行合并的批处理文件
  • 将文本日志文件的结果读入变量
  • 检查变量中是否存在单词“ERROR”的任何实例,并根据是否在日志文件中找到单词error 弹出成功或失败对话框。

    我认为快速而简单,但我似乎在条件语句上苦苦挣扎。这是脚本:

    cmd /c c:\users\PERSON\desktop\merge.bat
    
    $c = get-content c:\replmerg.log
    
    if ($c -contains ("ERROR"))
    {
        $a = new-object -comobject wscript.shell
        $b = $a.popup(“ERROR - Database Merge“,0,”Please Contact Support”,1)
    }
    
    else
    {
        $a = new-object -comobject wscript.shell
        $b = $a.popup(“SUCCESS - Database Merge“,0,”Good Job!”,1)
    }
    

    现在发生的情况是脚本运行并只是跳到成功消息。我可以确认,简单地在 powershell 中运行“get-content”命令将自行生成一个变量,然后我可以调用该变量并显示日志文件的内容。然而,我的脚本并没有看起来好像它实际上是在检查 $c 变量中的单词,然后按预期弹出错误消息。我在这里想念什么?

  • 【问题讨论】:

      标签: sql-server-2008 scripting powershell powershell-2.0


      【解决方案1】:

      包含运算符测试仅相同的值(不是值的一部分)。

      你可以试试这个

      $c = get-content c:\replmerg.log | select-string "ERROR" -casesensitive
      
      if ($c.length -gt 0)
      

      【讨论】:

      • 尝试将其放入,它仍然只是跳过第一个 IF 语句并弹出成功消息。不过感谢您的帮助!
      • 奇怪...在这里模拟做得很好!也许 ERROR 是小写的?
      • 实际上没有 length 属性可以进行比较,因为如果有任何匹配,$c 是类型 matchinfo 否则 $c 是 $null .使用 if ($c) { } else { } 应该可以正常工作,因为您是隐式 if ($c -eq $null)
      • @Greg:你说得对!在我的测试中,在发布答案之前,我使用了一个包含许多匹配项的文件!我确信(没有测试,大错误)返回类型总是一个数组对象。谢谢!
      【解决方案2】:

      克里斯蒂安的回答是正确的。您还可以使用 -match 运算符。例如:

      if ((Get-Content c:\replmerg.log) -match "ERROR")
      {
          'do error stuff'
      }
      else
      {
          'do success stuff'
      }
      

      如果您想要区分大小写的比较,可以使用 -cmatch

      【讨论】:

      • 由于某种原因,当 Christian 产生相同的结果时,Greg 你的 if 语句起作用了。不管怎样,非常感谢!
      • 不客气。 :) 实际上,Christian 的 if 失败的原因是因为 $c 实际上是类型 matchinfo 并且没有 length财产。当出现这样的问题时,知道你正在处理什么类型总是值得的。每次检查 $c.gettype(). 时都尝试使用不同的版本
      【解决方案3】:

      -contains 运算符用于在列表(或数组)中查找完全匹配。正如其他答案所示,您应该使用 -match、-like 或 -eq 来比较字符串。

      【讨论】:

        【解决方案4】:

        您实际上根本不需要使用 Get-Content。 Select-String 可以采用 -path 参数。我创建了两个非常简单的文本文件,一个包含单词 ERROR,另一个没有

        PS C:\> cat .\noerror.txt
        not in here
        PS C:\> cat .\haserror.txt
        ERROR in here
        this has ERROR in here
        PS C:\> if ( Select-String  -Path .\noerror.txt -Pattern ERROR) {"Has Error"}
        PS C:\> if ( Select-String  -Path .\haserror.txt -Pattern ERROR) {"Has Error"}
        Has Error
        PS C:\>
        

        可能会让您感到困惑的一件事是 -pattern 实际上采用正则表达式,因此请注意您在模式中使用的内容。这将在日志文件的任何位置找到 ERROR,即使有多个实例,例如在我的“haserror.txt”文件中。

        【讨论】:

          【解决方案5】:

          如果您只是想测试文件中是否存在字符串,则可以使用 select-string 的 -quiet 开关。

          select-string -path c:\replmerg.log -pattern "ERROR" -casesensetive -quiet
          

          如果在文件中找到字符串,则返回 $true,否则返回 $false。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-21
            • 2021-03-23
            • 1970-01-01
            • 2015-09-11
            相关资源
            最近更新 更多