使用Packer创建Windows AMI时遇CommandNotFoundException错误求助
解决Packer创建Windows 2019 AMI时的CommandNotFoundException错误
问题分析
日志提示指定的PowerShell脚本路径无法被识别,通常由以下几种原因导致:
- 目标脚本路径实际不存在(比如使用了错误的EC2初始化工具版本)
- PowerShell执行策略限制了脚本运行
- 脚本调用格式不正确,未使用正确的执行语法
解决方案
1. 确认EC2初始化工具版本及脚本路径
AWS Windows AMI现在默认使用EC2LaunchV2替代旧版EC2Launch,两者的脚本路径不同:
- 旧版EC2Launch路径:
C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\ - 新版EC2LaunchV2路径:
C:\ProgramData\Amazon\EC2LaunchV2\Scripts\
可以先在Packer配置中添加路径检查命令,确认脚本是否存在:
build { sources = ["source.amazon-ebs.windows-2019"] provisioner "powershell" { inline = [ # 检查旧版路径 "Test-Path 'C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1' | Write-Host '旧版脚本路径存在:'", # 检查新版路径 "Test-Path 'C:\\ProgramData\\Amazon\\EC2LaunchV2\\Scripts\\Initialize-Instance.ps1' | Write-Host '新版脚本路径存在:'" ] } }
2. 修正脚本调用语法
即使路径正确,直接运行脚本可能需要用&操作符显式调用,避免PowerShell将路径识别为字符串而非可执行命令:
build { sources = ["source.amazon-ebs.windows-2019"] provisioner "powershell" { inline = [ # 临时放宽执行策略,避免脚本被阻止 "Set-ExecutionPolicy Bypass -Scope Process -Force", # 用&调用旧版EC2Launch脚本 "& 'C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1' -Schedule", "& 'C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\SysprepInstance.ps1' -NoShutdown" ] } }
如果使用的是EC2LaunchV2,替换为对应脚本路径和命令:
build { sources = ["source.amazon-ebs.windows-2019"] provisioner "powershell" { inline = [ "Set-ExecutionPolicy Bypass -Scope Process -Force", "& 'C:\\ProgramData\\Amazon\\EC2LaunchV2\\Scripts\\Initialize-Instance.ps1' -Schedule", "& 'C:\\ProgramData\\Amazon\\EC2LaunchV2\\Scripts\\Invoke-Sysprep.ps1' -NoShutdown" ] } }
3. 处理PowerShell执行策略
如果实例默认执行策略较严格(比如Restricted),会阻止本地脚本运行。通过Set-ExecutionPolicy Bypass -Scope Process -Force仅在当前进程临时放宽限制,不会影响系统全局设置。
验证步骤
- 运行修改后的Packer配置,观察控制台输出的路径检查结果
- 根据路径存在情况选择对应脚本调用方式
- 确认provisioner阶段无报错,AMI创建完成
内容的提问来源于stack exchange,提问作者Learning Coding
相关产品推荐
相关产品推荐

