通过 Packer 在脚本中调用 ngen.exe 以创建 AWS AMI



我有这个脚本,我需要在打包程序创建的 AWS AMI 中调用它:

$path = Get-ChildItem C:WINDOWSMicrosoft.NETFramework -Filter ngen.exe -Recurse | % { $_.FullName }
Invoke-Expression -Command $path[0] executequeueditems

我在这里所做的,是首先寻找cmd ngen的路径.exe然后我称之为。

这是我在打包程序输出中遇到的错误:

2020-08-05T19:37:36+02:00: ==> amazon-ebs: Invoke-Expression : A positional parameter cannot be found that accepts argument 'executequeueditems'.
2020-08-05T19:37:36+02:00: ==> amazon-ebs: At C:WindowsTempscript-5f2ae86b-540f-14de-f644-90d9dee39092.ps1:2 char:1
2020-08-05T19:37:36+02:00: ==> amazon-ebs: + iex $path[0] executequeueditems
2020-08-05T19:37:36+02:00: ==> amazon-ebs: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2020-08-05T19:37:36+02:00: ==> amazon-ebs:     + CategoryInfo          : InvalidArgument: (:) [Invoke-Expression], ParameterBindingException
2020-08-05T19:37:36+02:00: ==> amazon-ebs:     + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeExpressionCommand

我不明白这里出了什么问题。 在我的笔记本电脑中,我可以毫无错误地调用此命令。这是我笔记本电脑的输出:

C:WindowsMicrosoft.NETFrameworkv4.0.30319>ngen.exe executequeueditems
Microsoft (R) CLR Native Image Generator - Version 4.7.3056.0
Copyright (c) Microsoft Corporation.  All rights reserved.
All compilation targets are up to date.
C:WindowsMicrosoft.NETFrameworkv4.0.30319>

我对 ngen 了解不多.exe(我所做的只是为开发团队创建 AMI),但这里是文档: https://learn.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator

似乎executequeueditems是正确的命令/选项。

在调用之前,我需要安装一些东西吗?

你不需要Invoke-Expression(事实上,不建议这样做)。

我认为你可以这样做:

Get-ChildItem  $env:SystemRootMicrosoft.NETFramework ngen.exe -Recurse | ForEach-Object {
& $_.FullName executequeueditems
}

请注意,如果它存在于Framework下的多个子目录中,它将多次运行ngen.exe

最新更新