如何调用Start Job,它取决于与调用Start Job的函数位于同一powershell模块中的函数



我正在编写一些powershell,以便在单个模块中与AWS API对话。我已经编写了一个函数Get-CloudFormation,它返回CloudFormation的状态。我编写了另一个函数Delete-CloudFormation,在发出delete-CF API请求后,尝试启动一个作业,该作业使用我的Get-CloudFormation轮询CloudFormation的状态。

我在Get-CloudFormation上调用Export-ModuleMember(但不是Delete-CloudFormation;这是一个私有函数)。Get-CloudFormation在模块文件中的定义早于Delete-CloudFormation

我的Start-Job呼叫(在Delete-CloudFormation内部)看起来像:

$job = Start-Job -Name "CloudFormationWaitForDeleteSuccess" -ScriptBlock {
    $status = ""
    $time = 0
    while($status -ne "DELETE_COMPLETE") {
        Write-Verbose ("Checking CloudFormation status")
        $stack = Get-CloudFormation -accessKey $accessKey -secretKey $secretKey -stackName $stackName
        $status = $stack.Status
        Start-Sleep -seconds 10
        $time += 10
    }
    Write-Host "CloudFormation delete-complete after $time seconds $stackName"
}

Delete-CloudFormation运行时,我得到一个异常:

The term 'Get-CloudFormation' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again.
+ CategoryInfo          : ObjectNotFound: (Get-CloudFormation:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

为什么?我该如何修复它?

我找到了7152090,我认为这是类似的,但用-InitializationScript { Get-CloudFormation }调用Start-Job会给出大致相同的错误。

如果我用-InitializationScript { Import-Module ".awsutils.psm1" }调用Start Job,那么.就是我的配置文件的文档目录。即使我在Start-Job之外将一个变量绑定到Get-Location并像-InitializationScript { Import-Module "$locationawsutils.psm1" }一样调用它。

在powershell模块的规范路径中移动模块awsutils.psm1

$env:userprofiledocumentsWindowsPowerShellModulesawsutils"

然后像这个一样初始化启动作业

-InitializationScript { Import-Module awsutils }

用我的自定义模块测试并开始工作。

如果你不想移动你的psm1,也可以试试这个:

-InizializationScript { import-module -name c:yourpathyourmodulefolder }

其中CCD_ 20仅包含一个psm1文件。

后台作业是自主的。它们不是一个单独的线程共享资源,它们实际上是在一个全新的PowerShell.exe进程中运行的。因此,我认为您需要在脚本块中使用Import-Module,以使模块成员在那里可用。

我最终做的是在调用Start-Job之前设置$env:WhereAmI = Get-Location,然后更改为-InitializationScript { Import-Module "$env:WhereAmIawsutils.psm1 }。在Start-Job调用之后,我调用Remove-Item env:WhereAmI进行清理。

(我想要一个不需要我在$PSModulePath中开发模块的解决方案,因为这样设置源代码控制会有点困难。)

感谢您的回复。

$root = $PSScriptRoot
$initScript = [scriptblock]::Create("Import-Module -Name '$rootModulesPublish-Assigned_CB_Reports.psm1'")
$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList

相关内容

  • 没有找到相关文章

最新更新