我遇到了一个问题,我尝试在作为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地址**
1条答案
按热度按时间oaxa6hgo1#
从关于范围(强调我):
对于在会话外执行的任何脚本或命令,您需要Using作用域修饰符来嵌入来自调用会话作用域的变量值,以便会话外代码可以访问它们。
这意味着内部的
$Using:computer
只在周围的Invoke-Command
的作用域中查找变量$computer
,而变量$computer
并不存在。要解决此问题,请在内部变量
Invoke-Command
之前创建一个局部变量$computer1
:我将变量命名为
$computer1
,这样您就可以更好地看到$using:
引用的是哪个变量,但您甚至可以将其命名为$computer
。