9

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

我呼吁Export-ModuleMemberGet-CloudFormation但不是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我认为是相似的,但调用Start-Jobwith-InitializationScript { Get-CloudFormation }给出了大致相同的错误。

如果我调用 Start-Job ,-InitializationScript { Import-Module ".\awsutils.psm1" }那么.就是我的个人资料的文档目录。即使我将变量绑定到Get-Location外部Start-Job并像-InitializationScript { Import-Module "$location\awsutils.psm1" }.

4

4 回答 4

8

将您的模块移动awsutils.psm1到 powershell 模块的规范路径中:

$env:userprofile\documents\WindowsPowerShell\Modules\awsutils"

然后像这样初始化开始工作

-InitializationScript { Import-Module awsutils }

用我的自定义模块和开始工作进行测试。

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

-InizializationScript { import-module -name c:\yourpath\yourmodulefolder\ }

其中yourmoduleforder仅包含一个 psm1 文件。

于 2012-02-22T13:43:03.930 回答
3

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

于 2012-02-22T13:44:01.017 回答
0

我最终做的是$env:WhereAmI = Get-Location在调用之前设置Start-Job,然后更改为-InitializationScript { Import-Module "$env:WhereAmI\awsutils.psm1 }. 打完Start-Job电话,我打来Remove-Item env:\WhereAmI打扫。

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

感谢您的回复。

于 2012-02-22T17:10:57.330 回答
0
$root = $PSScriptRoot

$initScript = [scriptblock]::Create("Import-Module -Name '$root\Modules\Publish-Assigned_CB_Reports.psm1'")

$job1 = Start-Job -InitializationScript $initScript -ScriptBlock {} -ArgumentList
于 2015-10-20T17:12:38.297 回答