Powershell-Invoke-VMScript-如何将变量插入脚本变量?

时间:2018-10-18 11:52:34

标签: powershell invoke

我正在尝试使用invoke-vmscript通过其macaddress修改我们所有服务器上的IPV4参数。

$vms = import-csv C:\temp\adapter_vm.csv -Delimiter ";"

foreach($vm in $vms){ 

 $serveur = $vm.name
 $mac = $vm.macaddress
 $dns = "$interfaceindex = get-netadapter | where-object MacAddress -Like $($mac) | select-object InterfaceIndex; set-dnsclient -InterfaceIndex $interfaceindex.InterfaceIndex -UseSuffixWhenRegistering $true -RegisterThisConnectionsAddress $true -ConnectionSpecificSuffix test"

 Invoke-VMScript -VM $serveur -ScriptType Powershell -ScriptText $dns -GuestUser secret -GuestPassword secret

}    

我的问题是远程计算机无法识别$ interfaceindex。

set-dnsclient需要interfaceindex,这就是我使用$ interfaceindex的原因。

你能帮我吗?

也许还有另一种方法?

谢谢!

----------------------------------------------------------------------------------------

=:术语'='不被识别为cmdlet,函数,脚本的名称  文件或可运行的程序。检查名称的拼写,或者路径是否为  (包括),确认路径正确,然后重试。  在第1行:5个字符  +&{= get-netadapter | where-object MacAddress -like 00-50-56-a1-33-61 |  选择- ...  +〜      + CategoryInfo:ObjectNotFound:(=:String)[],CommandNotFoundEx     知觉      + FullyQualifiedErrorId:CommandNotFoundException

Set-DnsClient:无法处理参数的参数转换  “接口索引”。无法将值“ .InterfaceIndex”转换为类型  “ System.UInt32 []”。错误:“无法将值“ .InterfaceIndex”转换为类型  “ System.UInt32”。错误:“输入字符串的格式不正确。”  在线:1字符:134  + ... InterfaceIndex .InterfaceIndex -UseSuffixWhenRegistering为False  -RegisterThisConn ...  + ~~~~~~~~~~~~~~~      + CategoryInfo:无效数据:( :) [Set-DnsClient],ParameterBindi     ngArgumentTransformationException      + FullyQualifiedErrorId:ParameterArgumentTransformationError,Set-DnsClie     nt

2 个答案:

答案 0 :(得分:1)

使用wmiobject实际上更好,因为它可以在Windows 2008和2012上运行。

$vms = import-csv C:\temp\adapter_vm.csv -Delimiter ";"

foreach($vm in $vms){ 

 $serveur = $vm.name
 $mac = $vm.macaddress
 $dns = "(get-wmiobject -class Win32_NetworkAdapterConfiguration | where-object {`$_.MacAddress -Like ""$($mac)""}).SetDynamicDNSRegistration(`$TRUE, `$TRUE)"

 Invoke-VMScript -VM $serveur -ScriptType Powershell -ScriptText $dns -hostcredential $domaincred

}

答案 1 :(得分:0)

您的$dns字符串存在(至少)两个问题。

首先:尝试@Boxdog所说的内容,并在初始$符号前面添加反引号。
第二:您必须在-InterfaceIndex $($interfaceindex.InterfaceIndex)周围使用括号。

您的完整字符串应如下所示:

$dns = "`$interfaceindex = get-netadapter | where-object MacAddress -Like $($mac) | select-object InterfaceIndex; set-dnsclient -InterfaceIndex $($interfaceindex.InterfaceIndex) -UseSuffixWhenRegistering $true -RegisterThisConnectionsAddress $true -ConnectionSpecificSuffix test"

尝试一下。

编辑:也许您还需要在第二个$interfaceIndex之前添加反引号。.(`$ interfaceindex.InterfaceIndex)

EDIT2: 有时很难理解所有这些符号的使用:-)。在set-dnsClient参数的文档中,它表明对于参数InterfaceIndex来说,它“指定接口的索引号。”
使用您的代码$interfaceindex = get-netadapter | where-object MacAddress -Like $($mac) | select-object InterfaceIndex,您的变量中就有。.
尝试使用类似($interfaceindex.InterfaceIndex[0])的方法(不要忘记在“(”之后的反引号肢体)