开发者

Search Variable for String then Run Conditional Statement in PowerShell

开发者 https://www.devze.com 2023-03-02 15:51 出处:网络
I am pretty new with PowerShell. I was recently tasked with making a error message popup that would help a local user determine whether or not a MS SQL on-demand DB merge worked or not. I wrote a scri

I am pretty new with PowerShell. I was recently tasked with making a error message popup that would help a local user determine whether or not a MS SQL on-demand DB merge worked or not. I wrote a script that woudld do the following:

  • Run the batch file that conducted the merge
  • Read the results of a text log file into a variable
  • Check the variable for any instances of the word "ERROR" and pop a success or fail dialog box depending on whether or not it found the word error in the log file.

    Quick and simple I thought but I appear to be struggling with the conditional statement. Here is the script:

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

    Right now what happens is that the script runs and just skips to the Success message. I can confirm that simply running the 'get-content' command in powershell will on its own produce a variable that I can then call and show the content of the log file. My script however does not appear as though it is actually checking the $c variable for the word and then popping the error message as intended. What am I missing here?


    Christian's answer is correct. You could also use the -match operator. For example:

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

    You can use -cmatch if you want a case sensitive comparison.


    You actually don't need to use Get-Content at all. Select-String can take a -path parameter. I created two very simple text files, one which has the word ERROR and one which does not

    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:\>
    

    The one thing that might trip you up is that the -pattern actually takes a regular expression, so be careful of what you use for your pattern. THis will find ERROR anywhere in the log file, even if there are multiple instances, like in my "haserror.txt" file.


    The -contains operator is used for looking for an exact match in a list (or array). As the other answers indicate, you should use -match, -like, or -eq to compare strings.


    You can use the -quiet switch of select-string if you just wnat to test for the presence of a string in a file.

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

    Will return $true if the string is found in the file, and $false if it is not.


    contain operator test only an identical value (not part of a value).

    You can try this

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

    精彩评论

    暂无评论...
    验证码 换一张
    取 消