【问题标题】:Invoke-Sqlcmd leaves script at 'PS SQLSERVER: \>' promptInvoke-Sqlcmd 在 'PS SQLSERVER: \>' 提示符处留下脚本
【发布时间】:2018-06-28 15:17:25
【问题描述】:

我有一个查询 MS SQL 数据库的脚本,如下所示:

$query = "SELECT Path FROM repoLocations WHERE hostId = '$($hostId)'"
$results = Invoke-Sqlcmd -Query $query -ServerInstance $dbHost -Database $dbName -Username $dbUser -Password $dbPass -ErrorAction Stop

这完全可以解决一个小问题。在新打开的 PowerShell 控制台会话中,第一次运行脚本或任何使用 Invoke-Sqlcmd 的脚本时,会有几秒钟的延迟,大概是模块在完成之前加载的位置。 SQL 查询确实有效并且总是返回正确的结果,但在第一次运行时,提示将留在:

PS SQLSERVER:\>

这会导致后续文件操作失败。

我有一个解决方法/解决方案,即在Invoke-Sqlcmd 之后立即添加以下代码行,这使得脚本和提示每次都能按预期工作:

$query = "SELECT Path FROM repoLocations WHERE hostId = '$($hostId)'"
$results = Invoke-Sqlcmd -Query $query -ServerInstance $dbHost -Database $dbName -Username $dbUser -Password $dbPass -ErrorAction Stop
Set-Location -Path $PSScriptRoot

只要我使用相同的 PowerShell 会话,问题就不会再次发生,并且 SQL 命令之前的暂停不存在。

还有许多其他类似主题的问题包含“解决方法”,但我很好奇是否有更好的解决方法,可能是在脚本开始之前预加载 SQL cmdlet,然后再继续?如果没有,我将需要在脚本可能使用的每个Invoke-Sqlcmd 处使用Set-Location

【问题讨论】:

  • 仅供参考,您的查询很容易受到 SQL 注入攻击。$hostId = "Robert'; DROP TABLE students;-- xkcd.com/327
  • 改用SqlServer模块,指定替换SqlPs,不存在这个问题。
  • @JeroenMostert 我不知道 sqlserver 可以替代 sqlps 并且可以从 powershell 库中获得。这非常感谢!把它写成答案,我会这样标记。善良的 Rdgs,罗伯。

标签: sql-server powershell sqlcmd cmdlets


【解决方案1】:

我之前遇到过类似的问题。你说的对。执行Invoke-Sqlcmd 后,脚本路径变为PS SQLSERVER: \>。就我而言,我在脚本中也有其他操作,需要使用像 Get-ChildItemGet-Content 这样的 cmdlet。正如预期的那样,这些命令不起作用,因为路径不是Windows Directory 路径。

在这种情况下,我像这样在Invoke-Sqlcmd之后使用push-location

$query = "SELECT Path FROM repoLocations WHERE hostId = '$($hostId)'"
$results = Invoke-Sqlcmd -Query $query -ServerInstance $dbHost -Database $dbName -Username $dbUser -Password $dbPass -ErrorAction Stop
Push-Location -Path $env:USERPROFILE

【讨论】:

  • 谢谢。这对我有用!我改用“Push-Location -Path $PSScriptRoot”。
  • 谢谢各位。像魅力一样工作,拯救了我的一天。
【解决方案2】:

是否可能在脚本开始前预加载 SQL cmdlet?

这是我的解决方案。

    try { Push-Location \ # importing sqlps switches you to the sql psdrive...
        Import-Module SQLPS
    } finally { Pop-Location }

这个实现的好处是脚本会Pop-Location你回到你所在的地方。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多