Вызов ngen.exe в сценарии Packer для создания AWS AMI - PullRequest
0 голосов
/ 05 августа 2020

У меня есть этот скрипт, который мне нужно вызвать внутри моего AWS AMI, созданного упаковщиком:

$path = Get-ChildItem C:\WINDOWS\Microsoft.NET\Framework -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:\Windows\Temp\script-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:\Windows\Microsoft.NET\Framework\v4.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:\Windows\Microsoft.NET\Framework\v4.0.30319>

Я мало что знаю о ngen.exe (все, что я делаю, это создаю AMI для команды разработчиков), но вот документация: https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator

и кажется, что executequeueditems - правильная команда / опция.

Нужно ли мне что-то устанавливать перед вызовом?

1 Ответ

1 голос
/ 06 августа 2020

Вам не нужно Invoke-Expression (и на самом деле не рекомендуется ).

Думаю, вы можете это сделать:

Get-ChildItem  $env:SystemRoot\Microsoft.NET\Framework ngen.exe -Recurse | ForEach-Object {
  & $_.FullName executequeueditems
}

Примечание что это будет запускаться ngen.exe несколько раз, если оно существует более чем в одном подкаталоге в Framework.

...