Powershell:在脚本中将整个命令保存到变量中
问题描述:
我希望将命令直接存储在脚本中的变量中,然后在脚本中稍后调用相同的命令。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,但似乎也运行该命令,而不是我希望它执行的操作。
答
分配这样的变量照例:
$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,我将使用第二种方法发布,其中整个命令被封装到一个变量中,然后使用&符号调用。 –
'$ command = {Invoke-Command -ComputerName $ Computer -Credential $ Credential -ScriptBlock {(Get-CimInstance Win32_SoftwareFeature -Filter“productname LIKE'Microsoft SQL Server%%Setup(English)'”)。ProductName}'and '&$命令'。 – PetSerAl