powershell 嵌套调用-用于群集主机和虚拟机的命令

0yg35tkg  于 2023-02-12  发布在  Shell
关注(0)|答案(1)|浏览(107)

我遇到了一个问题,我尝试在作为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,那么脚本运行时不会出现问题。
这是执行此任务的正确方法吗?我以前从未嵌套过Invoke-Command语句,但也许有一种更好的方法。我声明了**$Using**变量。
当脚本运行时,将出现以下错误:

    • 无法将参数绑定到参数"IPAddress",因为它是空字符串。+CategoryInfo:无效数据:(:)[新网络IP地址],参数绑定验证异常+完全限定错误ID:参数参数验证错误不允许空字符串,新网络IP地址**
oaxa6hgo

oaxa6hgo1#

从关于范围(强调我):
对于在会话外执行的任何脚本或命令,您需要Using作用域修饰符来嵌入来自调用会话作用域的变量值,以便会话外代码可以访问它们。
这意味着内部的$Using:computer只在周围的Invoke-Command的作用域中查找变量$computer,而变量$computer并不存在。
要解决此问题,请在内部变量Invoke-Command之前创建一个局部变量$computer1

$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 {
        $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

相关问题