我有一个查询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程序前的脚本?如果没有,我将需要在脚本可能使用的每Set-Location
处使用Invoke-Sqlcmd
。
答案 0 :(得分:0)
我之前遇到过类似的问题。你是对的。执行PS SQLSERVER: \>
后,脚本的路径将更改为Invoke-Sqlcmd
。就我而言,我在脚本中也有其他操作,需要使用像Get-ChildItem
和Get-Content
这样的cmdlet。正如所料,这些命令不起作用,因为路径不是Windows Directory
路径。
在这种情况下,我在push-location
之后使用了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
Push-Location -Path $env:USERPROFILE
答案 1 :(得分:0)
是否可能在执行程序之前在脚本开始处预加载SQL cmdlet?
那是我的解决办法。
try { Push-Location \ # importing sqlps switches you to the sql psdrive...
Import-Module SQLPS
} finally { Pop-Location }
此实现的好处是脚本可以Pop-Location
将您带回原来的位置。