我是PowerShell的新手。我最近负责制作一个错误消息弹出窗口,这将有助于本地用户确定MS SQL按需数据库合并是否有效。我写了一个脚本,woudld执行以下操作:
我认为快速而简单,但我似乎正在努力应对条件陈述。这是脚本:
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变量那样然后按预期弹出错误消息。我在这里错过了什么?
答案 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)