2017-10-20 67 views
0

我需要在300多个服务器中应用SQL Server修补程序,所以,我在下面创建了代码并将其保存为Apply_SQL_Patch.ps1。Powershell应用SQL修补程序多个服务器

我正在阅读包含所有服务器名称的txt文件,并且想要连接到它们,提取并应用修补程序。

的问题是,当我执行它,将它连接到服务器,但它不改变目录到d:\ SOFTWARE \补丁,从而对未来行错误:

$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程序:术语 不被识别为一个 cmdlet,函数的名称,脚本文件或可操作的程序 '\ SQLServer2014-KB4037356-x64.exe程序。'。检查名称的拼写 ,或者如果包含路径,请确认路径为 正确,然后重试。在D:\ software \ patch \ Apply_SQL_Patch.ps1:5 char:2 +。\ SQLServer2014-KB4037356-x64.exe/X:D:\ Software \ Patch + ~~~~~~~~~~~ (。\ SQLServer2014-KB4037356-x64.exe:String)[], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException

。\ setup.exe:术语'。\ setup.exe'不被识别为名称为 的cmdlet,函数,脚本文件或可操作程序。检查名称的拼写,或者如果包含路径,请确认路径 是正确的,然后重试。在D:\ software \ patch \ Apply_SQL_Patch.ps1:7 char:2 +。\ setup.exe/action = patch/instancename = SQL2014/quiet/IAcceptSQLServerLicense ... + ~~~~~~~~~ ~~ + CategoryInfo:ObjectNotFound:(\ SETUP.EXE:字符串)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException

感谢您的帮助!

+0

补丁300 + Sql Server实例肯定听起来像你真的需要一个配置管理解决方案。话虽如此,你是否已将补丁文件复制到远程服务器呢? – vonPryz

+0

Hi @ vonPryz!感谢回复!是的,补丁存在于名为:( – AdemirP

回答

0
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实例。

+0

!)的目录!感谢您的回复!它的工作部分。现在,我能够连接到服务器,更改目录,提取补丁,但是,它无法执行最后一行。 \ setup.exe,导致在下面的错误(我已检查和setup.exe存在)你能给我一些光?谢谢!术语'。\ setup.exe'不被识别为cmdlet的名称,函数,脚本文件或可操作程序。请检查 名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 – AdemirP

+0

@AdemirP当我运行'SQLServer2014-KB4037356-x64.exe'时,它异步运行。它立即返回控制,并在提取完成之前运行下一行。尝试'开始 - 进程-PSPath'。\ SQLServer2014-KB4037356-x64.exe'-ArgumentList'/ X:D:\ Software \ Patch'-Wait' –

+0

再次感谢!多长时间 - 等待会发生?它运行了一段时间,它看起来像冻结。是否需要一些命令开始运行下一行?最终代码如下:$ output = foreach($ GC in GC“D:\ Software \ Patch \ Servers_List.txt”) { Invoke-Command - 计算机名称$ cluster -ScriptBlock {D0 \ Software \ Patch \ Start-Process -PSPath'。\ SQLServer2014-KB4037356-x64.exe'-ArgumentList'/ X:D:\ Software \ Patch'-Wait 。\ SETUP.exe/action = patch/instancename = SQL2014/quiet/IAcceptSQLServerLicenseTerms} } – AdemirP