我有一个自动化的 Powershell 进程,该进程以 Invoke-Item 命令结束,以便为测试人员打开多个 SQL 文件(当前为 4 个 SQL 文件),以便他们可以运行脚本。请记住,我没有执行他们的脚本,我只是在我的进程结束后打开它们。测试人员当然可以自己打开脚本,但我希望能够为他们安排好一切。
问题是,SQL 脚本总是在多个 SSMS 实例中打开,通常第一个实例上有 3 个文件,第二个实例上有 1 个文件,但偶尔会有 2 个和 2 个。(当我将 SQL 文件的数量扩展为 10 个时,我得到四个实例,每个实例有 3、3、2 和 2 个文件。)
我的服务器使用不同的 SQL 版本,因此可执行文件的路径在不同系统之间可能不同。因此,直接调用附加文件名的 EXE 不是一个选项,除非我事先添加逻辑来找到 EXE 的正确路径。
注意:这些是不同的 SQL 版本(2008R2 至 2017),SSMS 版本将是安装附带的版本,而不是新的独立 SSMS
如何从 Powershell 在单个 SSMS 实例下打开所有 SQL 文件?
$sql = (Get-ChildItem -Path C:\Temp\Export | Where-Object {$_.Name -like "*.sql"}).FullName
II $sql
答案1
我希望避免这种情况,但我能够通过确定最新 SSMS.exe 的路径,然后使用 Call 运算符而不是 Invoke-Item 来解决这个问题。
$ssms = $null
If (Test-Path "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18"){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null -and (Test-Path "C:\Program Files (x86)\Microsoft SQL Server\150")){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server\150" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null -and (Test-Path "C:\Program Files (x86)\Microsoft SQL Server\140")){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server\140" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null -and (Test-Path "C:\Program Files (x86)\Microsoft SQL Server\130")){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server\130" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null -and (Test-Path "C:\Program Files (x86)\Microsoft SQL Server\120")){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server\120" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null -and (Test-Path "C:\Program Files (x86)\Microsoft SQL Server\110")){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server\110" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null -and (Test-Path "C:\Program Files (x86)\Microsoft SQL Server\100")){
$ssms = (Get-ChildItem -Path "C:\Program Files (x86)\Microsoft SQL Server\100" -Recurse | Where-Object -Property Name -EQ "ssms.exe").FullName}
If ($ssms -eq $null) {Write-Host "SSMS Has Not Been Been Found!" -BackgroundColor Red}
$sql = (Get-ChildItem -Path C:\Temp\Export | Where-Object {$_.Name -like "*.sql"}).FullName
& $ssms $sql
以这种方式排序目录可确保我打开最新的 SSMS 客户端,但更重要的是,它每次都会在同一个 SSMS 实例中打开所有 SQL 文件。