我的问题涉及PowerCLI的具体模块,但我希望它涉及PS Jobs更普遍的问题。我正在加载作业scriptblock中的命令所需的模块,但这些命令无法识别,就像未加载模块一样。
我在启动作业之前加载VMware powerCLI模型,如下所示,但是scriptblock中的代码无法识别模块已加载,因此无法识别get-vm命令。
import-module VMWare.VimAutomation.core Connect-VIServer -server VIServer01 $ NewJob = start-job -scriptblock {Get-VM -server VIServer01 |选择名称,@ {N ="群集&#34 ;; E = {Get-Cluster -VM $ }},@ {N =" ESXHost&#34 ;; E = {Get-VMHost -VM $ }}}
我熟悉将参数从脚本传递到作业脚本块的必要性和方法,但是如何让它识别模块已加载?此外,如果我从scriptblock中加载模块,我会发现堆栈溢出失败,我想由于模块的重复循环加载。
答案 0 :(得分:1)
启动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