我的问题涉及到PowerCLI的特定模块,但我希望它涉及到PS工作的更通用的问题。我正在加载作业scriptblock中命令所需的模块,但这些命令无法识别,好像模块未加载一样。
我在start-job之前加载VMware powerCLI模型,如下所示,但是scriptblock中的代码无法识别模块已加载,因此无法识别get-vm命令。
import-module VMWare.VimAutomation.coreconnect -server -server VIServer01$NewJob = start-job -scriptblock {Get-VM -server VIServer01 | Select Name, @{N="Cluster";E={Get-Cluster -VM $}},@{N="ESXHost";E={Get-VMHost -VM $}}}
我熟悉的需要,和方法,传递参数从脚本到作业脚本块,但我如何让它认识到模块是加载的?此外,如果我从scriptblock内加载模块,我得到一个堆栈溢出失败,我猜是由于模块的重复循环加载。
启动PS作业就像启动PS控制台的一个新实例。它不包含正在创建作业的脚本中的任何变量或加载的模块/管理单元。因此,我必须从作业scriptblock中加载snapin并将变量正确地传递到scriptblock中。但是通过添加-RunAs32,我能够防止PS中的堆栈溢出错误。我不知道为什么这会解决该错误。
foreach ($VIServer in $VIServers){
$NewJob = start-job {} -scriptblock { param([string]$VIServer)
Import-Module VMWare.VimAutomation.core
Connect-VIServer $VIServer
Get-VM -server $VIServer | Select Name, @(N="vCenter";E={$VIServer}},`
@{N="Cluster";E={Get-Cluster -VM $_}}, @{N="ESXHost";E={Get-VMHost -VM $_}}} -RunAs32 -ArgumentList $VIserver