【问题标题】:PowerShell Invoke-Sqlcmd switches into sqlps sessionPowerShell Invoke-Sqlcmd 切换到 sqlps 会话
【发布时间】:2014-06-11 13:56:19
【问题描述】:

我正在 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

【问题讨论】:

    标签: sql powershell invoke


    【解决方案1】:

    sqlps 模块的行为是将您留在它创建的psdrive 中。我相当肯定人们已经要求 Microsoft 解决此问题,因为它非常烦人且具有破坏性。

    PowerShell 3.0 引入的模块自动导入使这更加烦人,因为您可能直到事后才意识到自己正在导入模块。

    当我使用sqlps 时,我显式导入它,以便我可以按如下方式控制我的工作目录:

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

    加载模块后,这会将您返回到上一个目录。

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

    【讨论】:

    • 我没有明确导入模块。我只是在使用 Invoke-Sqlcmd。我尝试了推送位置,但它不起作用:
    • 现在它工作了。解决方案是使用@alroc 提供的sn -p 导入sqlps 模块。之后只需使用 Invole-Sqlcmd 而无需任何推送位置。
    • 无论您是隐式(自动导入)还是显式执行此操作,您仍在导入该模块,这会导致该行为。
    • SQLPS模块被Require语句加载时,如何防止出现问题?
    • @Florian 修复正在执行此操作的脚本/模块。 sqlps 几年前已被 sqlserver 取代,任何仍在尝试使用它的代码都应被视为已过时,要么修改要么替换。
    【解决方案2】:

    一个简单的 cd 'directory of your choice' 会让你回到你之前所在的目录。

    PS SQLSERVER:\> cd D:
    

    结果:

    PS D:\>
    

    【讨论】:

      【解决方案3】:

      今天超级用户也有类似的问题:https://superuser.com/questions/767427/stuck-in-powershell-sqlserver

      你应该可以直接回到 C:

      【讨论】:

      • 是的,我可以输入 c: 回到 ps。但如果可能的话,我想自动使用推送位置。
      猜你喜欢
      • 2016-01-15
      • 2017-09-30
      • 1970-01-01
      • 2012-09-13
      • 2014-04-15
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多