Ssas

使用 Invoke-Command 和 $variables 在 PowerShell 中停止、啟動或重新啟動 SSAS 表格服務實例

  • January 11, 2017

我正在使用一些 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

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/159898