将T-SQL结果转换为.txt文件,如果为空,是否发送警报?来自powershell脚本

将T-SQL结果转换为.txt文件,如果为空,是否发送警报?来自powershell脚本,powershell,Powershell,免责声明:我仍然不擅长写脚本,如果这是一个愚蠢的问题,请温柔一点!:) 我现在做的很简单。我使用的是SqlServerCmdletSnapin,它使我能够在powershell 1.0中运行t-sql查询,并将其返回到控制台或输出文件。我目前正在将其发送到一个.txt文件,到目前为止,我的代码如下: $sqlcheck = Invoke-Sqlcmd -Query "select * from client" -ServerInstance "TESTDB1\TESTSQL1" | out-fi

免责声明:我仍然不擅长写脚本,如果这是一个愚蠢的问题,请温柔一点!:)

我现在做的很简单。我使用的是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中国农业部国际标准普尔2003-08-0513:34:00国际标准普尔2003-08-0513: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文件
不输出任何内容。因此,在
$sqlcheck
中,将始终存在
$null
。您可以将其拆分为两个语句:

 $sqlcheck = Invoke-Sqlcmd -Query ...
 $sqlcheck | out-file ...
其次,索引以0开头,因此
$sqlcheck[1]
是一个错误。它应该是
$sqlcheck[0]

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

if ($sqlcheck -and $sqlcheck -match ...) { ... }
对于一些实验,请看

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

有两个问题

首先,
out文件
不输出任何内容。因此,在
$sqlcheck
中,将始终存在
$null
。您可以将其拆分为两个语句:

 $sqlcheck = Invoke-Sqlcmd -Query ...
 $sqlcheck | out-file ...
其次,索引以0开头,因此
$sqlcheck[1]
是一个错误。它应该是
$sqlcheck[0]

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

if ($sqlcheck -and $sqlcheck -match ...) { ... }
对于一些实验,请看

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

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

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

太棒了!谢谢你给我指明了正确的方向。使用Keith的子表达式操作符示例修复了我的问题。我一定会多读一些这方面的书。再次感谢各位!令人惊叹的!谢谢你给我指明了正确的方向。使用Keith的子表达式操作符示例修复了我的问题。我一定会多读一些这方面的书。再次感谢各位!谢谢基思,这个例子震撼了卡斯巴。谢谢基思,这个例子震撼了卡斯巴。