提问人:Todd 提问时间:6/6/2023 最后编辑:ProgmanTodd 更新时间:6/6/2023 访问量:50
远程变量
Remote variable
问:
我在将变量传递给远程 powershell 会话时遇到了问题,我已经在互联网上搜索了我能想到的任何地方,所以我希望有人可以提供帮助。 我有一个调用作业的函数,它告诉它启动一个脚本块
我正在尝试做的是编写一个脚本,以允许我从一个 VM 故障转移群集。如果一切都是硬编码的,它可以正常工作,但这意味着我必须为每次故障转移更改脚本,这根本不会随时拯救我。
$Computer = Server1
$Clustergrp = Cluster1
function FAILOVER(){
$job = Start-Job -scriptblock $JobScript
do {[System.Windows.Form.Application]::DoEvent() } until ($Job.State -eq "Completed")
$JobScript =
{
Invoke-Command -ComputerName $using:Computer -ScriptBlock {Move-ClusterGroup -Name $using:Clustergrp}
}
我在这里错过了什么?请帮忙!
我尝试使用参数和 $using:变量,但似乎没有任何效果。然而,如果我对脚本块中的所有内容进行硬编码,它每次都能工作。
我也尝试过只使用,但也没有用。-ComputerName $Computer -ScriptBlock{.....}
答:
0赞
Dom
6/6/2023
#1
Invoke-Command -ComputerName $using:Computer -ArgumentList $arg1 -ScriptBlock {param($arg) Move-ClusterGroup -Name $arg[0]}
评论
0赞
Todd
6/6/2023
这似乎行不通。$arg 1 应该是 $arg[1],我也试过了,但没有用。
0赞
Todd
6/6/2023
也试过了-ArgumentList $args[1] -ScriptBlock {param($arg) Move-ClusterGroup -Name $args[0]}
0赞
Dom
6/6/2023
invoke-command -computerName $Computer -ArgumentList $arg 1 -ScriptBlock {param($arg) Move-ClusterGroup -Name $arg[0]}
0赞
Todd
6/6/2023
Dom,不,那也没用。我在函数中有一堆写入主机,它们显示 $Clustergrp 和 $Computer 具有值。
2赞
Jeremy Caney
6/6/2023
感谢您对 Stack Overflow 社区的贡献。这可能是一个正确的答案,但提供代码的额外解释会非常有用,以便开发人员可以理解您的推理。这对于不熟悉语法或难以理解概念的新开发人员特别有用。为了社区的利益,您能否编辑您的答案以包含更多详细信息?
1赞
mklement0
6/6/2023
#2
一般要点:
Invoke-Command
有一个参数,因此无需使用 first 创建作业。-AsJob
Start-Job
若要等待作业完成,请使用
Wait-Job
cmdlet。如果您想立即等待,即如果您想开始同步执行,只需省略 .
-AsJob
- 请注意,的参数接受一个计算机名称数组,然后以并行方式作为目标。
Invoke-Command
-ComputerName
- 请注意,的参数接受一个计算机名称数组,然后以并行方式作为目标。
至于你试过的:
您嵌套了两个运行空间外(进程外)作用域,这也需要嵌套使用以下$using:
范围:
$Computer = 'Server1'
$Clustergrp = 'Cluster1'
$JobScript = {
# Create a *local* variable from the caller's
# $Clustergrp value, so it can again be referenced with
# $using: in the remotely executing Invoke-Command script block.
$Clustergrp = $using:Clustergrp
Invoke-Command -ComputerName $using:Computer -ScriptBlock {
Move-ClusterGroup -Name $using:Clustergrp
}
}
function FAILOVER {
$job = Start-Job -ScriptBlock $JobScript
$job | Wait-Job
}
评论
0赞
Todd
6/6/2023
感谢您的回答/解决方案。我以为这与范围界定问题有关,但我在杂草中太深了,看不到它!谢谢Mklement0
0赞
mklement0
6/6/2023
很高兴听到它有所帮助,@Todd;别客气。(这是一个范围问题:脚本块只能通过以下方式查看作业脚本块自己的变量Invoke-Command
$using:
)
1赞
Todd
6/6/2023
下次我一定会记住这个!再次感谢!
评论