2017-02-15 368 views
0

我希望将命令直接存储在脚本中的变量中,然后在脚本中稍后调用相同的命令。Powershell:在脚本中将整个命令保存到变量中

我试图做这样的:

$command = Invoke-Command -ComputerName $Computer -Credential $Credential -ScriptBlock{(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server% %Setup (English)'").ProductName} 
Invoke-Expression $command 

问题与该方法是第一次剧本遇到的代码的第一行,它试图运行该代码。当时在脚本中,我还没有分配剩余变量

这是特别的问题,我试图在脚本中运行PSExec。我有大约10个命令,我想将其包装到变量中,然后在脚本的各个点中调用。

$CreateSymbolicLink = .\PsExec\PsExec.exe \\$computer -u username -p password -accepteula -h -i 1 cmd "/c mklink /D C:\Applications \\server\Share" 

Invoke-Expression $CreateSymbolicLink 

但当剧本从一开始运行时,它实际运行PSEXEC当变量尚未确定,这我试图避免它这样。

我该如何做到这一点?我尝试过使用Set-Variable cmdlet,但似乎也运行该命令,而不是我希望它执行的操作。

+0

'$ command = {Invoke-Command -ComputerName $ Computer -Credential $ Credential -ScriptBlock {(Get-CimInstance Win32_SoftwareFeature -Filter“productname LIKE'Microsoft SQL Server%%Setup(English)'”)。ProductName}'and '&$命令'。 – PetSerAl

回答

0

分配这样的变量照例:

$a = { 
#script block code 
(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server% %Setup (English)'").ProductName 
} 

然后

Invoke-Command -ComputerName $Computer -Credential $Credential -ScriptBlock $a 

另一种方法,是,它包都成一个变量本身,与上述类似:

$command = { 
Invoke-Command -ComputerName $Computer -Credential $Credential -ScriptBlock{(Get-CimInstance Win32_SoftwareFeature -Filter "productname LIKE 'Microsoft SQL Server% %Setup (English)'").ProductName} 
} 

像这样调用它:

& $command 

第一个示例对于可以多次部署的不同环境更为有利,特别是在类似于Octopus Deploy的情况下,通过触角在多台机器上运行脚本块,就是这样一个想到的例子。

+0

这是完美的!非常感谢! :) 为了达到我的目的,我可能会使用这两种格式,但为了运行PSExec,我将使用第二种方法发布,其中整个命令被封装到一个变量中,然后使用&符号调用。 –

相关问题