Переменные VMware PowerCLI в ScriptText

Здравствуйте, у меня небольшая проблема с командлетом Invoke-VMScript. Я создал сценарий, который создает виртуальную машину с Windows 7, а затем на машине выполняется некоторый сценарий powershell, например, переименовывая компьютер в правильное имя.

Но если я побегу

Invoke-VMScript -ScriptText {(Get-Wmiobject -Class Win32_ComputerSystem).Rename($strName)}

Переменная $strName не разрешается, кто-нибудь знает, как это сделать?


person TelefoneN    schedule 11.09.2013    source источник


Ответы (4)


Вы неправильно определили область действия вашей переменной. Вот простой эксперимент, который вы можете провести в своей консоли:

PS C:\> $test = "Resolve!"
PS C:\> $test
Resolve!

# This scriptblock will not resolve the variable.
PS C:\> {$test}
$test

# This scriptblock will resolve the variable.
PS C:\> [scriptblock]::Create($test)
Resolve!

В документации Invoke-VMScript предлагается пройти -ScriptText в виде строки вместо ScriptBlock. Итак, в этом случае мы можем имитировать пример 2:

$string = "(Get-Wmiobject -Class Win32_ComputerSystem).Rename($strName)"
Invoke-VMScript -ScriptText $string

Переменные, заключенные в " ", будут разрешены.

person Anthony Neace    schedule 11.09.2013
comment
Hmmhmhm глупый из меня, чтобы не RTFM Но когда я передаю это как строку, я получаю сообщение об ошибке, в котором говорится, что мне не хватает ')' в финальном вызове метода. $strScript = (Get-WmiObject -Class win32_ComputerSystem).Rename($strName) Invoke-VMScript -ScriptText $strScript - person TelefoneN; 11.09.2013
comment
Похоже на синтаксическую ошибку. Убедитесь, что содержимое $strName ничего не нарушает, или иначе посмотрите, как Invoke-VMScript экранирует символы, и убедитесь, что это не нарушает ваш ввод. - person Anthony Neace; 11.09.2013

У меня нет подходящего гостя для переименования, но я следую LucD, вот рабочий пример использования переменных для создания входных данных для scriptText:

$svcName = "vmtools"
$guestScript = 'get-wmiObject win32_service | where {$_.name -eq "' + $svcName + '"}'
Invoke-VMScript -vm myVMname -scriptText $guestScript
person noam    schedule 13.09.2013

#Rename Computer command line script
$renamecomputer = "wmic path win32_computersystem where ""Name='%computername%'"" CALL     rename name='$VM'"
#Send command line script to GuestOS
Invoke-VMScript -VM $VM -GuestUser $GU -GuestPassword $GP -ScriptType Bat -ScriptText   $renamecomputer

Это то, что я использую для моего сценария переименования. Работает хорошо

person Bawb Taum    schedule 28.10.2013

У меня это работает:

Invoke-VMScript -VM $vm -ScriptText "(Get-WmiObject win32_computersystem).rename(""${vmName}"")"
person Evren Kuzucuoglu    schedule 18.02.2015