UserData默认情况下将在Windows Server 2022 AMI上的AWS EC2实例上运行Powershell V5.1。但是,我想使用一些仅在Powershell版本7或更高版本中支持的cmdlet。
我如何能够最好地运行一个脚本与Powershell 7+时启动实例与UserData?
我目前有一个安装powershell 7的脚本,但是从那时起,我不确定如何使用v7来运行我拥有的其余命令。
Invoke-WebRequest -Uri https://github.com/PowerShell/PowerShell/releases/download/v7.3.1/PowerShell-7.3.1-win-x64.msi -OutFile PowerShell.msi
Start-Process msiexec.exe -ArgumentList '/i PowerShell.msi /quiet' -Wait
我使用的是WINDOWS_SERVER_2022_ENGLISH_FULL_BASE AMI。
我试过使用像Invoke-Expression
这样的东西,也试过让脚本递归地用一些条件调用自己,例如
# First Run with ps 5.1
if ($PSVersionTable.PSVersion -lt [Version]"7.0") {
Invoke-WebRequest -Uri https://github.com/PowerShell/PowerShell/releases/download/v7.3.1/PowerShell-7.3.1-win-x64.msi -OutFile PowerShell.msi
Start-Process msiexec.exe -ArgumentList '/i PowerShell.msi /quiet' -Wait
cd "C:Program FilesPowerShell7"
# Run this same script with ps7
./pwsh $PSCommandPath
exit
}
#
if ($PSVersionTable.PSVersion -gt [Version]"7.0") {
# Do the things I need to do with ps7...
}
我的两次尝试都默默地失败了,并且使用ec2 userdata很难获得原因的信息。
最终有效的方法是使用2个不同的脚本。第一个脚本安装PS7,然后从S3下载第二个脚本并使用PS7执行它。
用户数据执行PS5:
#init.ps1
<powershell>
Invoke-WebRequest -Uri https://github.com/PowerShell/PowerShell/releases/download/v7.3.1/PowerShell-7.3.1-win-x64.msi -OutFile PowerShell.msi
Start-Process msiexec.exe -ArgumentList '/i PowerShell.msi /quiet' -Wait
cd "C:Program FilesPowerShell7"
mkdir (Split-Path -Path 'C:/temp/setupGateway.ps1' ) -ea 0
Read-S3Object -BucketName 'my-bucket' -key 'setupGateway.ps1' -file 'C:/temp/setupGateway.ps1' -ErrorAction Stop
& "C:Program FilesPowerShell7pwsh" "C:tempsetupGateway.ps1"
</powershell>
<persist>true</persist>
PS7脚本,单独执行:
# setup.ps1
Write-Output $PSVersionTable
Write-Output "Hello from PS7"
要使此工作,所需要做的就是确保将setup.ps1
脚本复制到S3位置。这可以通过许多不同的方式实现,具体取决于您的其余设置。