我希望将命令直接存储在脚本中的变量中,然后在脚本中稍后调用该命令。
我试图这样做:
$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 :(得分: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,在具有触角的多台机器上运行脚本块,即一个想到这样的例子。