PowerShell调用Invoke-Sqlcmd切换到sqlps会话

22

我正在PowerShell ISE中编写脚本,并使用Invoke-Sqlcmd命令。 执行完命令后,Powershell会切换到sqlps会话(PS SQLSERVER:>),我无法第二次执行脚本。我必须退出PowerShell ISE并重新启动。

所以我的问题是:如何从sqlps切换回常规ps或如何防止Invoke-Sqlcmd切换会话。

Invoke-Sqlcmd -ServerInstance $server -Database master -Username $user -Password $password   -InputFile $file `
   -ErrorAction Stop -OutputSqlErrors $true -Variable $variable

这样行不通:

Push-Location
Invoke-Sqlcmd -ServerInstance $server -Database master -Username $user -Password $password   -InputFile $file `
-ErrorAction Stop -OutputSqlErrors $true -Variable $variable
Pop-Location
3个回答

39

sqlps模块的行为是让你停留在它创建的psdrive中。我相信人们曾经要求微软修复这个问题,因为它非常烦人和干扰。

由PowerShell 3.0引入的模块自动导入功能使这一点更加令人恼火,因为你可能甚至没有意识到你正在导入该模块,直到事后。

当我使用sqlps时,我会明确地导入它,以便按以下方式控制我的工作目录:

push-location
import-module sqlps -disablenamechecking
pop-location

加载模块后,此命令将使您返回先前的目录。

非常晚的编辑说明:随着 SQL Server Management Studio 2016 的推出,我们有了一个新的 PowerShell 模块 sqlserver,它取代了 sqlps 并解决了这个问题。


我没有显式地导入该模块。我只是使用Invoke-Sqlcmd。我尝试了push-location,但它不起作用: - scar80
现在它可以运行了。解决方法是使用@alroc提供的代码片段导入sqlps模块。之后,只需使用Invoke-Sqlcmd而不需要任何push-location。 - scar80
无论您是隐式地(自动导入)还是显式地导入,您仍然会导入该模块,从而引起该行为。 - alroc
如何防止通过“Require”语句加载“SQLPS”模块时出现问题? - Akaizoku
@Florian 修复正在执行此操作的脚本/模块。sqlps 已经在几年前被 sqlserver 取代,任何仍试图使用它的代码都应视为过时的,需要进行修订或更换。 - alroc

4

一个简单的cd '你选择的目录'命令会让你回到之前所在的目录。

PS SQLSERVER:\> cd D:

结果:

PS D:\>

1

是的,我可以输入 c: 返回到 ps。但如果可能的话,我想自动使用 push-location。 - scar80

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接