O PowerShell não consegue ver os locais de rede depois que o módulo SQLPS é carregado

1

Estou tentando automatizar um script que faz backup de um banco de dados em um ambiente, copia-o para o outro e o restaura lá. Mas há algum comportamento estranho acontecendo.

Primeiro, tento acessar um local de rede. Funciona como uma felicidade:

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

Retorna

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

No entanto, assim que eu importar o módulo Sqlps (que é a coleção do SQL Server Management Objects - SMO) para interagir com o banco de dados, os locais da rede não poderão mais ser encontrados:

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

Retorna:

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

Acessar locais de arquivos comuns não é problema e apenas funciona.

Como posso acessar os locais de rede depois de ter carregado o módulo / SMO do SQLPS?

    
por vstrien 15.08.2016 / 13:38

2 respostas

2

Quando você executa o comando Import-Module Sqlps -DisableNameChecking; , sua localização atual é alterada imediatamente para PS SQLSERVER:\> . Estar "em" SQLSERVER impede que você use Get-ChildItem relacionado a um local de unidade.

Primeiro, você precisará alterar seu local atual de volta para um local da unidade com Set-Location ou cd . Em seguida, você poderá usar Get-ChildItem para a pasta e, em seguida, voltar para SQLSERVER:\ (se necessário):

Exemplo:

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

Também devo observar que o comportamento de alterar sua localização ao importar o módulo é um bug que foi corrigido no SQL Server 2016 . No futuro, a sua localização atual não mudaria não para SQLSERVER:\ , pelo que não necessitaria de Set-Location para uma localização de unidade.

    
por 15.08.2016 / 14:01
0

Como @amwo já mencionado, o motivo é que você está "no" SQL Server, onde o Get-ChildItem , mas também outros conceitos como Move-Item se aplicam ao objeto SQL Server (em oposição a filesystem-objects). / p>

Para forçar os cmdlets a usar os locais fornecidos como locais do sistema de arquivos, você pode preceder o caminho com Microsoft.PowerShell.Core\FileSystem:: da seguinte forma:

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

Agora, o PowerShell tenta acessar o caminho como um caminho do sistema de arquivos e o caminho da rede fica disponível novamente.

    
por 15.08.2016 / 14:05