在String中搜索变量,然后在PowerShell中运行条件语句

时间:2011-05-04 15:36:04

标签: sql-server-2008 scripting powershell powershell-v2.0

我是PowerShell的新手。我最近负责制作一个错误消息弹出窗口,这将有助于本地用户确定MS SQL按需数据库合并是否有效。我写了一个脚本,woudld执行以下操作:

  • 运行进行合并的批处理文件
  • 将文本日志文件的结果读入变量
  • 检查变量是否有“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)
    }
    

    现在发生的事情是脚本运行并跳转到Success消息。我可以确认,只需在powershell中运行'get-content'命令就可以生成一个变量,然后我可以调用该变量并显示日志文件的内容。但是,我的脚本看起来并没有像检查单词的$ c变量那样然后按预期弹出错误消息。我在这里错过了什么?

  • 5 个答案:

    答案 0 :(得分:4)

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

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

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

    答案 1 :(得分:2)

    您实际上根本不需要使用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”文件中。

    答案 2 :(得分:1)

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

    答案 3 :(得分:1)

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

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

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

    答案 4 :(得分:0)

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

    你可以试试这个

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