使用 Invoke-Command 和 $variables 在 PowerShell 中停止、啟動或重新啟動 SSAS 表格服務實例
我正在使用一些 PowerShell 命令/腳本來停止、啟動或重新啟動 SSAS 表格服務實例,使用
Invoke-Command
和一些$variables
. 最終目標是最終將此程式碼放入代理作業中,以便於重新啟動服務,但這超出了本文的範圍——我需要$variables
首先使用它。我在我的源(本地)機器上使用 PowerShell 5.0,並嘗試停止/啟動/重新啟動遠端 SSAS 2012 表格伺服器實例(11.0.6540.0)。
首先,我以
Set-ExecutionPolicy
.Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force
然後,使用硬編碼方法只是為了獲得正確的語法並在 RDP 進入伺服器時觀察 SQL Server 配置管理器 (Config Mgr) 以驗證命令是否正常工作,我使用以下 PowerShell 程式碼:
Invoke-Command -ComputerName DevServer { stop-service 'MSOLAP$TABULAR' }
這很好用。我在 Config Mgr 中驗證服務停止。
我還驗證了以下 2 個 PowerShell 程式碼腳本是否有效:
Invoke-Command -ComputerName DevServer { start-service 'MSOLAP$TABULAR' }
和
Invoke-Command -ComputerName DevServer { restart-service 'MSOLAP$TABULAR' }
優秀。效果很好。
現在我開始將東西放入變數中,如下所示:
$tabularinstance = 'MSOLAP$TABULAR' $server = "DevServer" $stop = "stop-service $tabularinstance" $start = "start-service $tabularinstance" $restart = "restart-service $tabularinstance"
然後我顯示變數的值以驗證預期結果:
# show values $tabularinstance $stop $start $restart $server
我在 PowerShell 控制台中返回以下結果:
PS H:\> # show values $tabularinstance $stop $start $restart $server MSOLAP$TABULAR stop-service MSOLAP$TABULAR start-service MSOLAP$TABULAR restart-service MSOLAP$TABULAR DevServer
好的,所以事情看起來不錯。然後我執行下面的 PowerShell 命令,期望它可以工作,但伺服器上什麼也沒發生;Config Mgr 沒有顯示服務已停止,它仍在執行:
Invoke-Command -ComputerName $server { $stop }
然後我意識到該
$tabularinstance
變數沒有包裝撇號,所以我嘗試了這個:$tabularinstance = '''MSOLAP$TABULAR''' # triple apostrophes needed to get the ' escape character and apply the apostrophes to variable
然後重新設置
$stop
、$start
和$restart
變數以使用更新後的$tabularinstance
變數:$stop = "stop-service $tabularinstance" $start = "start-service $tabularinstance" $restart = "restart-service $tabularinstance"
並再次重新顯示它們以驗證它們是否包含環繞撇號:
PS H:\> # show values $tabularinstance $stop $start $restart $server 'MSOLAP$TABULAR' stop-service 'MSOLAP$TABULAR' start-service 'MSOLAP$TABULAR' restart-service 'MSOLAP$TABULAR' DevServer
是的,他們有。然後我
InvokeCommand
再試一次:Invoke-Command -ComputerName $server { $stop }
消極的。仍然沒有工作。在 ConfigMgr 中,服務仍在執行。
我什至想嘗試將完整的命令分配給變數,看看它是如何解決的:
$test = "Invoke-Command -ComputerName $server { $stop }"
然後檢查結果:
PS H:\> $test Invoke-Command -ComputerName DevServer { stop-service 'MSOLAP$TABULAR' }
這對我來說也很合適。它看起來與我在硬編碼所有內容而不是使用
$variables
.那麼為什麼我的 PowerShell 不能使用該
$variables
方法工作呢?少了什麼東西?
在傳遞變數時,腳本塊的工作方式略有不同。您必須告訴命令遠端電腦上的變數包含什麼。
同樣,如果您想將完整命令作為變數傳遞,您需要將變數類型設為
[scriptblock]
.$stop = "stop-service 'MSOLAP$TABULAR'" Invoke-Command -ComputerName $server { $stop }
這需要更改為這樣的內容(更改變數名稱以適應我的範例):
$MyService = 'W32Time' $get = [scriptblock]::create( "param(`$servicename) Stop-Service `$servicename") Invoke-Command -ComputerName sql2014-01 -ScriptBlock $get -ArgumentList $MyService
另一種方法:
$MyService = 'W32Time' Invoke-Command -ComputerName SQL2014-01 -ScriptBlock {param($servicename); Stop-Service $servicename } -ArgumentList $MyService