Powershell:在脚本期间将整个命令保存到变量中

时间:2017-02-15 23:14:18

标签: 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,但似乎也运行该命令,而不是我想要它做的。

1 个答案:

答案 0 :(得分:2)

像往常一样分配变量:

$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,在具有触角的多台机器上运行脚本块,即一个想到这样的例子。