15

我有一个大型的现有 powershell 脚本库,主要用于运行 SQL Server 和文件系统之间的一些复杂逻辑和交互。

SQL 交互通常通过 cmdlet 执行Invoke-SQLCmd

最近,我所有服务器上的 SSMS 版本都升级到了 2012。这意味着我必须对我的代码进行一些更改以删除对sqlserverprovidersnapin100和的引用,sqlservercmdletsnapin100因为这些在 2012 年被弃用以支持导入SQLPs模块。

这工作正常,但似乎SQLPs模块在某些时候将当前位置更改为PS SQLSERVER>而不是<local folder>,这使得我的许多其他命令都失败了。例如,如果我Test-Path在网络驱动器上运行 a ,它在该位置上运行良好,<local folder>但在该位置上会失败SQLSERVER

这是一个已知的问题?我可以为此更改解决方法或设置吗?

我担心的主要脚本超过 1000 行,并且在我们进行此更改之前已经运行了两年多没有问题,所以如果可以的话,我想避免对其进行逐行测试。

4

3 回答 3

26

关于为什么在 sql 2012 中它正在更改为 SQLSERVER: 目录的更多信息...

当 powershell 导入 sqlps 模块时,manifest 定义了一个名为 SqlPsPostScript.ps1 的 post 脚本文件。此文件(第一行)将当前位置更改为 SQLSERVER:提供程序

在 x64 位盒上,模块位于 - C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\SQLPS。

在 powershell 3.0 中,自动导入可能很难判断何时会发生(根据我的经验)。

目前尚不清楚为什么(从逻辑的角度来看)它应该这样做。我们不想接触 SQL 服务器模块,所以我猜你需要在导入模块后做一个明确的设置位置。您也可以将其视为一种不那么 hacky 的解决方案。

Push-Location
Import-Module sqlps
Pop-Location
于 2013-01-08T00:55:59.563 回答
8

我已经通过添加 acd <local folder>作为脚本的第一行来突破提供程序解决了这个问题。不过感觉很hackish。

于 2012-10-16T14:30:27.340 回答
0

我通过使用我试图复制的文件的 PSPath 属性(其中包含 Microsoft.PowerShell.Core\FileSystem::) 而不是默认属性解决了类似的问题。希望能帮助到你 !

于 2019-12-16T10:46:14.043 回答