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

问题描述:

免责声明:如果这是一个愚蠢的问题,我仍然吮吸写作脚本请温柔! :)T-SQL结果为.txt文件,如果为null则发送警报?从powershell脚本

我在做什么很简单。我正在使用SqlServerCmdletSnapin,它使我能够在PowerShell 1.0中运行t-sql查询并将其返回到控制台或out-file。我现在把它发送到一个文本文件,到目前为止我的代码是在这里:

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

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

谢谢!

有两个问题。

首先,out-file不输出任何东西。所以在$sqlcheck里面会有总是$null。您可以将它分成两条语句:

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

二,索引以0开头,所以$sqlcheck[1]是错误的。它应该是$sqlcheck[0]

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

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

对于一些实验看

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

太棒了!感谢您指点我正确的方向。使用Keith的解决我的问题的子表达式运算符的例子。 我一定会对此做更多的阅读。再次感谢你们! – xbnevan 2010-03-03 21:16:40

除了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。

+0

谢谢Keith,这个例子震动了casbah。 – xbnevan 2010-03-03 21:17:21