1

Я пытаюсь автоматизировать сценарий, который создает резервную копию базы данных в одной среде, копирует ее в другую, а затем восстанавливает ее там. Но происходит странное поведение.

Сначала я пытаюсь получить доступ к сети. Работает как блаженство

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?

2 ответа2

2

При запуске 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 обратно на место на диске.

0

Как уже упоминалось @AMtwo, причина в том, что вы "в" SQL Server, где Get-ChildItem , а также другие концепции, такие как Move-Item применяются к объекту SQL Server (в отличие от объектов файловой системы).

Чтобы заставить командлеты использовать местоположения, которые вы указали в качестве местоположений файловой системы, вы можете добавить путь к Microsoft.PowerShell.Core\FileSystem:: как это:

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

Теперь PowerShell пытается получить доступ к пути как путь к файловой системе, и сетевой путь снова доступен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .