我有一个试图添加到 sql 代理作业中的 powershell 脚本,但作业步骤失败并出现以下错误
A job step received an error at line 1 in a PowerShell script. The corresponding line is 'import-module SQLPS -DisableNameChecking'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'Could not load file or assembly 'file:///C:\Program Files (x86)\Microsoft SQL Server\130\Tools\PowerShell\Modules\SQLPS\Microsoft.SqlServer.Management.PSSnapins.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
我认为该错误是由模块路径的差异引起的,因此我通过 $env:PSModulePath 显式设置路径以匹配代码运行良好的 powershell 会话的路径。我对powershell很陌生,所以您可以提供的任何帮助将不胜感激
我现在只是在做一些测试,所以一切都在我的桌面上本地运行。我正在运行 SQL Server 2012。
当您使用“PowerShell”类型运行 SQL 代理作业步骤时,您实际上并没有在(完整的)PowerShell 中运行。这种作业步骤类型实际上在
sqlps.exe
基于 PowerShell 1.0 和数量极其有限的 cmdlet 的 minishell 下运行。实际上,PowerShell 作业步骤类型不是很有用。相反,我建议使用“操作系统/CMDExec”作业步骤,并
PowerShell.exe
从命令行调用。使用 cmdexec 作业步骤类型,您的作业步骤将如下所示:
通过调用
PowerShell.exe
,您可以获得完整/当前的 PowerShell shell(而不是迷你 shell),并且可以使用完整/当前的 SQL Server PowerShell 模块。如果您使用的是 SQL Server 2016+,这一点尤其重要,其中SQLSERVER
模块已通过更长的 cmdlet 列表得到增强。也请查看此博客文章。http://www.sqlhammer.com/running-powershell-in-a-sql-agent-job/
Powershell 和 SQL 代理作业可能会预先出现一些问题。这篇博客文章解释了它们以及如何绕过它们。本质上,SQL 加载的模块与脚本加载的模块不同。
从作业中删除导入模块,SQL Server 已经启动并加载了 SQLPS,在 2012 年它加载了 2.0 版本的 powershell,因此您的脚本可能需要更多调整。