远程变量

Remote variable

提问人:Todd 提问时间:6/6/2023 最后编辑:ProgmanTodd 更新时间:6/6/2023 访问量:50

问:

我在将变量传递给远程 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{.....}

PowerShell 作业 脚本块

评论


答:

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 创建作业。-AsJobStart-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
下次我一定会记住这个!再次感谢!