我正在使用一些 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]
.这需要更改为这样的内容(更改变量名称以适应我的示例):
另一种方法: