T-SQL结果为.txt文件,如果为null则发送警报?来自powershell脚本

时间:2010-03-03 19:27:02

标签: powershell

免责声明:如果这是一个愚蠢的问题,我仍然很喜欢写脚本! :)

我正在做的很简单。我正在使用SqlServerCmdletSnapin,它使我能够在powershell 1.0中运行t-sql查询并将其返回到控制台或外部文件。我目前正在将它发送到.txt文件,到目前为止我的代码在这里:

$sqlcheck = Invoke-Sqlcmd -Query "select * from client" -ServerInstance "TESTDB1\TESTSQL1" | out-file -filepath "C:\MyFolder\Client_Result.txt" 

上面返回一行sql(例子):

1 CAAT PI 2003-08-05 13:34:00 PI 2003-08-05 13:34:00

因此,这会将结果发送到.txt文件。我试图完成的是从打印到.txt文件的结果,如果它没有返回任何内容或空白,而不是失败,它应该发送一封电子邮件。

我已经为此编写了一个电子邮件功能,但我磕磕绊绊的是我实际上将如何检查空结果或我猜$ null结果。我可能正在使用完全错误的逻辑但是,我写这样的东西:

$sqlcheck = Invoke-Sqlcmd -Query "select * from client" -ServerInstance "TESTDB1\TESTSQL1" | out-file -filepath "C:\MyFolder\Client_Result.txt" 
if($sqlcheck -is [Array]){
if($sqlcheck[1] -match "OK"){
echo "Status is OK" > C:\MyFolder\Result.log
}
}
else{
Send-Email
}

显然不行!有人请给我一些知识。 :)

谢谢!

2 个答案:

答案 0 :(得分:3)

除了stej提到的内容之外,您可以使用数组子表达式运算符-is [array]而不是显式检查@(),以确保结果是数组。

$sqlcheck = @(Invoke-Sqlcmd -Query "select * from client" `
                            -ServerInstance "TESTDB1\TESTSQL1")
if ($sqlcheck.Count -eq 0) {
    Send-MailMessage ...
}
else {
    $sqlcheck > C:\MyFolder\Client_Result.txt
}

在这种情况下,$ sqlcheck将始终是一个数组,其中包含0,1或n个元素。另请注意,PowerShell 2.0具有内置的Send-MailMessage cmdlet。

答案 1 :(得分:1)

有两个问题。

首先,out-file不输出任何内容。因此,在$sqlcheck中,将会有所有$null。您可以将其拆分为两个语句:

 $sqlcheck = Invoke-Sqlcmd -Query ...
 $sqlcheck | out-file ...

其次,索引从0开始,因此$sqlcheck[1]是错误的。它应该是$sqlcheck[0]

您还可以跳过检查$sqlcheck(简单对象或对象数组)中所有项目的类型和使用匹配。通常,使用@(<item>)语法比Keith建议的更安全。

if ($sqlcheck -and $sqlcheck -match ...) { ... }

对于某些实验,请查看

if ($null) { 'true' }
if (@($null)) { 'true' }
if (,@($null)) { 'true' }
if (('a','b','c') -match 'c') { 'true' }