PowerShell:在脚本中将整个命令保存到变量中

3
我希望在脚本中直接将一个命令存储在变量中,并在脚本的后续部分调用该命令。
我尝试使用以下方式实现:
$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,但它似乎也会运行命令,这不是我想要的。


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

7

像往常一样分配变量,如下所示:

$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这样的情况,可以在拥有“触手”的多台机器上运行脚本块。这就是我能想到的一个例子。


这太完美了!非常感谢! :) 为了我的目的,我可能会同时使用两种格式,但是对于运行PSExec,我将使用您发布的第二种方法,其中整个命令被包装到一个变量中,然后使用“&”符号调用。 - Adam Zaloum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接