【问题标题】:Nesting Invoke-Command for clustered hosts and virtual machines集群主机和虚拟机嵌套Invoke-Command
【发布时间】:2023-01-27 18:33:13
【问题描述】:

我遇到了一个问题,即我尝试在 VM 上运行命令,该 VM 作为 Windows 故障转移群集的一部分列在两个节点之一上。

$computers = Import-Csv -Path 'C:\Temp\PS Scripts\References\IPList.csv' -Delimiter ","
$localCred = Get-Credential -Message "Local credentials required" -UserName Administrator
$domainCred = Get-Credential -Message "Local credentials required" -UserName Domain\Administrator
foreach ($computer in $computers) {
    Invoke-Command -Computer $computer.Host -Credential $domainCred -ScriptBlock {
        Invoke-Command -VMName $Using:computer.VMName -Credential $Using:localCred -ScriptBlock {
            New-NetIPAddress -IPAddress $Using:computer.IPAddress -PrefixLength $Using:computer.PrefixLength -AddressFamily $Using:computer.AddressFamily -InterfaceAlias $Using.computer.InterfaceAlias -DefaultGateway $Using:computer.DefaultGateway
}}}

由于这些是局部变量,我需要在 Invoke-Command 脚本块中将它们声明为远程变量。

如果我在不嵌套两个调用命令的情况下运行上述命令,那么脚本运行时不会出现问题。

这是执行此任务的正确方法吗?我以前从未嵌套过 Invoke-Command 语句,但也许有更好的方法来实现。我宣布$使用多变的。

脚本运行时,出现如下错误:

无法将参数绑定到参数“IPAddress”,因为它是一个空字符串。 + CategoryInfo : InvalidData: (:) [New-NetIPAddress], ParameterBindingValidationException + FullyQualifiedErrorId:ParameterArgumentValidationErrorEmptyStringNotAllowed,New-NetIPAddress

【问题讨论】:

    标签: powershell scripting powershell-remoting


    【解决方案1】:

    来自about Scopes(强调我的):

    对于在会话外执行的任何脚本或命令,您需要使用范围修饰符来嵌入变量值调用会话范围,以便会话外的代码可以访问它们。

    这意味着内部$Using:computer 只在周围Invoke-Command 的范围内寻找变量$computer,它不存在。

    为了解决这个问题,在内部Invoke-Command之前创建一个局部变量$computer1

    $computers = Import-Csv -Path 'C:TempPS ScriptsReferencesIPList.csv' -Delimiter ","
    $localCred = Get-Credential -Message "Local credentials required" -UserName Administrator
    $domainCred = Get-Credential -Message "Local credentials required" -UserName DomainAdministrator
    foreach ($computer in $computers) {
        Invoke-Command -Computer $computer.Host -Credential $domainCred -ScriptBlock {
            $computer1 = $using:computer
            Invoke-Command -VMName $Using:computer.VMName -Credential $Using:localCred -ScriptBlock {
                New-NetIPAddress -IPAddress $Using:computer1.IPAddress -PrefixLength $Using:computer1.PrefixLength -AddressFamily $Using:computer1.AddressFamily -InterfaceAlias $Using.computer1.InterfaceAlias -DefaultGateway $Using:computer1.DefaultGateway
    }}}
    

    我已将变量命名为$computer1,这样您可以更好地看到$using: 指的是哪个变量,但您甚至可以将其命名为$computer

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2017-01-11
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2016-09-09
      • 2011-12-24
      • 2015-03-24
      相关资源
      最近更新 更多