我需要在300多个服务器中应用SQL Server补丁,因此,我已在下面创建了代码并将其保存为Apply_SQL_Patch.ps1。
我正在阅读包含所有服务器名称的txt文件,并且我想要连接到它们,提取并应用Patch。
问题是当我执行它时,它连接到服务器,但它没有将目录更改为D:\ Software \ Patch,导致下一行出错:
$output = foreach ($cluster in GC "D:\Software\Patch\Servers_List.txt")
{
Enter-PSSession -ComputerName $cluster
cd D:\Software\Patch\
.\SQLServer2014-KB4037356-x64.exe /X:D:\Software\Patch
.\setup.exe /action=patch /instancename=SQL2014 /quiet /IAcceptSQLServerLicenseTerms
}
$output | Out-File -Append D:\Software\Patch\Patch_Result.txt
以下错误:
。\ SQLServer2014-KB4037356-x64.exe:该术语 ' \ SQLServer2014-KB4037356-x64.exe程序'不被识别为a的名称 cmdlet,函数,脚本文件或可操作程序。检查拼写 如果包含名称,或者包含路径,请验证路径是否正确 正确,然后再试一次。在D:\ software \ patch \ Apply_SQL_Patch.ps1:5 焦炭:2 +。\ SQLServer2014-KB4037356-x64.exe / X:D:\ Software \ Patch + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ObjectNotFound:(。\ SQLServer2014-KB4037356-x64.exe:String)[], CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException
。\ setup.exe:术语'。\ setup.exe'不被认为是的名称 cmdlet,函数,脚本文件或可运行程序。检查 拼写名称,或者如果包含路径,请验证路径 是正确的,然后再试一次。在D:\ software \ patch \ Apply_SQL_Patch.ps1:7 焦炭:2 +。\ setup.exe / action = patch / instancename = SQL2014 / quiet / IAcceptSQLServerLicense ... + ~~~~~~~~~~~ + CategoryInfo:ObjectNotFound:(。\ setup.exe:String)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException
感谢您的帮助!
答案 0 :(得分:1)
Enter-PSSession -ComputerName $cluster
cd D:\Software\Patch\
.\SQLServer2014-KB4037356-x64.exe /X:D:\Software\Patch
.\setup.exe /action=patch /instancename=SQL2014 /quiet /IAcceptSQLServerLicenseTerms
我认为这不会像你想的那样奏效。您正在创建一个会话,然后在本地执行三个命令 。
尝试:
Invoke-Command -ComputerName $cluster -ScriptBlock {
cd D:\Software\Patch\
Start-Process -PSPath '.\SQLServer2014-KB4037356-x64.exe' -ArgumentList '/X:D:\Software\Patch' -Wait
.\setup.exe /action=patch /instancename=SQL2014 /quiet /IAcceptSQLServerLicenseTerms
}
我已经将补丁提取命令替换为上面的命令,因为该命令会立即将控制权返回给PowerShell。您可能需要使用setup.exe执行相同的操作。我没有要测试的SQL 2014实例。