我正在尝试自动执行一个脚本,该脚本在一个环境中备份数据库,将其复制到另一个环境,然后在那里恢复。但是出现了一些奇怪的行为。
首先,我尝试访问网络位置。运行起来非常顺畅:
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 尝试像文件系统路径一样访问该路径,并且网络路径再次可用。