web-dev-qa-db-ja.com

Invoke-Commandと$ variablesを使用してPowerShellでSSASテーブルサービスインスタンスを停止、開始、または再起動する

Invoke-Commandと一部の$variablesを使用して、SSASテーブルサービスインスタンスを停止、開始、または再起動するPowerShellコマンド/スクリプトの作業をしています。最終的な目標は、このコードを最終的にエージェントジョブに配置してサービスを簡単に再起動することですが、それはこの投稿の範囲を超えています-最初に$variablesで動作させる必要があります。

ソース(ローカル)マシンでPowerShell 5.0を使用していて、リモートSSAS 2012表形式サーバーインスタンス(11.0.6540.0)を停止/開始/再起動しようとしています。

最初に、スクリプトをSet-ExecutionPolicyで始めます。

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force

次に、ハードコードされたメソッドを使用して構文を正しく取得し、SQL Server構成マネージャー(Config Mgr)を監視しながら、サーバーにRDPを実行してコマンドが機能していることを確認し、次の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

OK、それで物事は良いようです。次に、以下の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メソッドを使用して機能しないのでしょうか。何が欠けていますか?

3

変数を渡す場合、スクリプトブロックの動作は少し異なります。リモートコンピューターで変数に何が含まれているかをコマンドに通知する必要があります。

同様に、コマンド全体を変数として渡したい場合は、変数のタイプとして[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

enter image description here

反対に:

$MyService = 'W32Time'
Invoke-Command -ComputerName SQL2014-01 -ScriptBlock {param($servicename); Stop-Service $servicename }  -ArgumentList $MyService

enter image description here

2
user507