抑制来自Azure SQL PowerShell命令的输出

3
我有一个 Powershell 脚本,用于将我们的生产数据库复制到测试环境,并执行相关的清理活动。我希望对控制台输出的信息进行清理,并且在清理 Az.sql 命令产生的错误消息方面遇到了一些麻烦。
我的首要操作之一是尝试查看是否存在需要清理的临时数据库。
#clean up existing
$availableDatabase = Get-AzSqlDatabase -ResourceGroupName $TestResourceGroup -ServerName $TestServerName -DatabaseName $TestTempDatabaseName

如果没有发现它,我将在控制台中获得以下错误输出:
Remove-AzSqlDatabase : The Resource 
'Microsoft.Sql/servers/xxxx/databases/reap_prod_copy_2' under resource group 'xxxx' was not found.
At C:\Users\xxxx\Desktop\reap-replace-test.ps1:17 char:1
+ Remove-AzSqlDatabase -ResourceGroupName $TestResourceGroup -ServerNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : CloseError: (:) [Remove-AzSqlDatabase], CloudException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Sql.Database.Cmdlet.RemoveAzureSqlDatabase

我希望捕获这个输出,并提供一个简单的“不存在”消息,甚至只是完全跳过任何输出。我尝试在结尾处加上"| Out-Null",但这似乎并没有影响输出。有什么见解吗?

我想捕获命令的输出结果,并提供一个简单的"不存在"信息,甚至干脆不显示任何输出。我已经尝试在命令结尾添加"| Out-Null",但它好像并没有对输出产生任何影响。你有什么建议吗?


1
你尝试过在 Remove-AzSqlDatabase 中使用 -ErrorAction Stop 参数的 try/catch 块吗? - Benjamin Hubbard
使用-ErrorAction Stop/SilentlyContinue和| Out-Null的组合,看起来我可以实现我想要的...感谢您提供这些常见参数的提示! - Ben Krueger
我的回复能解决您的问题吗? - Joy Wang
2个回答

3

您只需要使用if(){}else{}语句即可实现此操作,尝试以下脚本,它在我的机器上运行良好。

$availableDatabase = Get-AzSqlDatabase -ResourceGroupName $TestResourceGroup -ServerName $TestServerName -DatabaseName $TestTempDatabaseName -ErrorAction SilentlyContinue
if ($availableDatabase){

    Remove-AzSqlDatabase -ResourceGroupName $TestResourceGroup -ServerName $TestServerName -DatabaseName $TestTempDatabaseName
    Write-Host "Remove the sql db" $TestTempDatabaseName

}else{
    Write-Host "The sql db" $TestTempDatabaseName "does not exist" 

    }

测试结果:

图片描述

图片描述


-ErrorAction SilentlyContinue 对我来说是缺失的关键。 - phillyd

0
你可以使用 try catch 代码块来捕获异常。
try {
    #clean up existing
    $availableDatabase = Get-AzSqlDatabase -ResourceGroupName $TestResourceGroup -ServerName $TestServerName -DatabaseName $TestTempDatabaseName
} 
catch {
    Write-Host "Does not exist"
    $availableDatabase = $null
}

if ($availableDatabase -ne $null) {
    # ... Do stuff with database
}

以上代码将执行try块中的所有内容,如果遇到任何类型的错误,则会执行catch块中的所有内容。根据实现方式,if语句可能是必要的或不必要的。

请参见关于Try Catch Finally

注意:上述catch块将捕获任何错误,无论是否由缺少表格引起。通常最好在catch后包含特定的异常类型,以避免消除可能需要修复的不相关错误。


这实际上是我尝试的第一种方法,但出现错误时它似乎没有进入catch块?它仍然在控制台中抛出错误,并且不打印Write-Host输出... - Ben Krueger
你能在问题中发布你尝试过的代码吗? - spicy.dll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接