PowerShell 有一个很酷的模块用于与 SQL Server 交互。其中一项功能是能够导航数据库对象,如文件系统对象。例如:
get-childitem -Path "SQLSERVER:\SQL\MSI\DEFAULT\DATABASES"
但是,我收到的不是对象列表,而是以下错误消息:
get-childitem : Cannot find drive. A drive with the name 'SQLSERVER' does not exist.
At line:1 char:1
+ get-childitem -Path "SQLSERVER:\SQL\"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (SQLSERVER:String) [Get-ChildItem], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
在花了几个小时并获得了一些白发之后,我无意中发现如果至少进行一次以下调用就可以让它工作:
invoke-sqlcmd
然后get-childitem
看到SQLSERVER
磁盘并返回给我一个表列表。美丽 :-)
显然,调用invoke-sqlcmd
会改变环境中允许get-childitem
与SQLSERVER
. 但是,无论是在文档中还是在 Internet 上的示例中,我都没有找到任何相关信息,这让我认为问题出在我的系统上。我错过了什么?他们只是忘了在文档中提及它吗?或者它不是错误而是功能,并invoke-sqlcmd
执行授权?
我在测试中使用了 Windows 授权
操作系统:Windows 10 企业版和 Windows Server 2019
SQL Server 版本:15.0.2000.5 开发者版
我认为您看到的是PowerShell 3+ 中存在的模块自动加载。在您从该模块执行一个或多个函数之前,该
SQLSERVER
模块不会加载到您的会话中(因此PSDrive
不存在)。import-module sqlserver
您可以在使用驱动器之前在您的会话/脚本中显式加载模块SQLServer
,并且从那时起它将可用。