我正在使用 PowerShell 备份 SQL Server 数据库并使用 Windows 任务调度程序来调度脚本
测试
手动运行脚本,它可以工作。
SQL Server 备份文件 (test.bak
) 和测试文件 (HelloWorld.txt
) 均已创建。通过 Windows 任务计划程序运行,仅创建了
HelloWorld.txt
,未创建 SQL Server 备份文件。
至少是这样;
- PowerShell 脚本确实运行了。
- 凭证可以用于手动运行
问题
为什么从 Windows 任务计划程序运行时未创建 SQL SErver 备份文件?
这是我的 SQLbackup.ps1
文件:
$credential = import-clixml -path c:\pp\test\sqlcred.xml
Backup-SqlDatabase -ServerInstance Server264\SUPPORT2K19 -Database PPTest -BackupAction Database -BackupFile "C:\PP\Test\Test.bak" -Credential $credential
Set-Content -Path "C:\PP\Test\HelloWorld.txt" -Value "Hello World"
任务计划程序设置为:
- 用户是SYSTEM,
- 选择运行用户是否登录
- 以最高权限运行
在操作选项卡中:
- 程序:powershell
- 添加参数:
-executionpolicy bypass -file C:\PP\Test\sqlbackup.ps1
为什么没有创建 SQL Server 备份文件的任何建议?
回答1
我认为 cmdlet Backup-SqlDatabase
会产生错误,而您没有捕获该错误的机制。
尝试实现 try/catch
以捕获错误,然后您可以使用该信息做您想做的事情,例如:
$credential = import-clixml -path c:\pp\test\sqlcred.xml
try {
Backup-SqlDatabase -ServerInstance Server264\SUPPORT2K19 -Database PPTest -BackupAction Database -BackupFile "C:\PP\Test\Test.bak" -Credential $credential -ErrorAction Stop
}
catch {
Set-Content -Path "C:\PP\Test\Error.txt" -Value "$_"
}
Set-Content -Path "C:\PP\Test\HelloWorld.txt" -Value "Hello World"
这将捕获潜在的 error
并将其写入 Error.txt
文件,与 HelloWorld.txt
的方式相同。
重要的部分是 Try/Catch
仅捕获终止错误,因此我们在 cmdlet 末尾添加 -ErrorAction Stop
以使任何错误终止,以便我们可以执行 catch
脚本块中的脚本。
您可以在 Microsoft 文档中了解更多信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_try_catch_finally?view=powershell-7.2
附言该文档适用于 Powershell 7.2