【发布时间】: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 查询确实有效并且总是返回正确的结果,但在第一次运行时,提示将留在:
这会导致后续文件操作失败。
我有一个解决方法/解决方案,即在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