Powershell - Invoke-VMScript - Как вставить переменную в переменную сценария? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь использовать invoke-vmscript для изменения параметров IPV4 на всех наших серверах, используя их macaddress.

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

Не могли бы вы мне помочь?

Может быть, есть другой способ?

Спасибо!

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

=: Термин '=' не распознается как имя командлета, функции, файла сценария или работоспособной программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.В строке: 1 символ: 5 + & {= get-netadapter |где-объект MacAddress -Like 00-50-56-a1-33-61 |select- ... + ~ + CategoryInfo: ObjectNotFound: (=: String) [], CommandNotFoundEx ception + FullyQualifiedErrorId: CommandNotFoundException

Set-DnsClient: Невозможно обработать преобразование аргумента для параметра 'InterfaceIndex'.Не удалось преобразовать значение ".InterfaceIndex" в тип "System.UInt32 []".Ошибка: «Невозможно преобразовать значение« .InterfaceIndex »в тип« System.UInt32 ». Ошибка:« Введенная строка была неверного формата. »« В строке: 1 символ: 134 + ... InterfaceIndex .InterfaceIndex -UseSuffixWhenRegistering False -RegisterThisConn ... + ~~~~~~~~~~~~~~~ + CategoryInfo: InvalidData: (:) [Set-DnsClient], ParameterBindi ngArgumentTransformationException + FullyQualifiedErrorId: ParameterArgumentTransformationError, Set-DnsClie nt * 1017

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Использование 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

}
0 голосов
/ 18 октября 2018

Есть (как минимум) две проблемы с вашей $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]) (не забывайте обратный удар после "(" парантеза)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...