2017-10-20 120 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