加载 SQLPS 模块后,PowerShell 无法查看网络位置

加载 SQLPS 模块后,PowerShell 无法查看网络位置

我正在尝试自动执行一个脚本,该脚本在一个环境中备份数据库,将其复制到另一个环境,然后在那里恢复。但是出现了一些奇怪的行为。

首先,我尝试访问网络位置。运行起来非常顺畅:

C:\> Get-ChildItem \\remote-server\e$

返回

Directory: \\remote-server\e$
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         19-3-2015     11:49            Program Files

但是,一旦我导入 Sqlps 模块(SQL Server 管理对象 - SMO 的集合)用于与数据库交互,就再也找不到网络位置了:

PS C:\> Import-Module Sqlps -DisableNameChecking;
PS SQLSERVER:\> Get-ChildItem \\remote-server\e$

返回:

Get-ChildItem : Cannot find path '\\remote-server\e$' because it does not exist.
At line:1 char:1
+ Get-ChildItem \\remote-server\e$
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (\\remote-server\e$:String)[Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

访问常规文件位置没有问题,并且可以正常工作。

加载 SQLPS 模块/SMO 后,如何访问网络位置?

答案1

运行该Import-Module Sqlps -DisableNameChecking;命令时,您的当前位置会立即更改为PS SQLSERVER:\>。处于“SQLSERVER”中会阻止您使用Get-ChildItem与驱动器位置相关的功能。

首先,您需要使用Set-Location或将当前位置更改回驱动器位置cd。然后,您将能够使用Get-ChildItem该文件夹,然后导航回SQLSERVER:\(如有必要):

例子:

PS C:\ > Import-Module Sqlps -DisableNameChecking;
PS SQLSERVER:\> Set-Location C:\
PS C:\> Get-ChildItem \\remote-server\e$
PS C:\> Set-Location SQLSERVER:\

我还应该注意,在导入模块时更改位置的行为是SQL Server 2016 中修复的一个错误。将来,您的当前位置将不是切换到SQLSERVER:\,这样您就不需要Set-Location返回驱动器位置。

答案2

正如@AMtwo 已经提到的,原因是您“在”SQL Server 中,其中Get-ChildItem,还有其他概念Move-Item适用于 SQL Server 对象(而不是文件系统对象)。

要强制 cmdlet 使用您提供的位置作为文件系统位置,您可以在路径前面添加Microsoft.PowerShell.Core\FileSystem::如下内容:

Get-ChildItem "Microsoft.PowerShell.Core\FileSystem::\\remote-server\e$"

现在,PowerShell 尝试像文件系统路径一样访问该路径,并且网络路径再次可用。

相关内容