在EC2上的Windows Server 2022上使用Powershell>= 7.0运行用户数据

11dmarpk  于 2023-01-21  发布在  Windows
关注(0)|答案(1)|浏览(175)

默认情况下,UserData将在Windows Server 2022 AMI上的启动AWS EC2示例上与Powershell V5.1一起运行。但是,我想使用仅在Powershell版本7和更高版本中支持的一些cmdlet。
在使用UserData引导示例时,如何才能最好地使用Powershell 7+运行脚本?
我目前有一个安装powershell7的脚本,但从那时起,我不确定如何使用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服务器2022英语版完整版基础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 Files\PowerShell\7"
    # 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,很难得到原因的信息。

rryofs0p

rryofs0p1#

最终成功的方法是有两个不同的脚本,第一个脚本安装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 Files\PowerShell\7"
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 Files\PowerShell\7\pwsh" "C:\temp\setupGateway.ps1"
</powershell>
<persist>true</persist>

PS7脚本,单独执行:

# setup.ps1
Write-Output $PSVersionTable
Write-Output "Hello from PS7"

要完成这项工作,需要做的就是确保将setup.ps1脚本复制到S3位置,这可以通过许多不同的方式来实现,具体取决于其余的设置。

相关问题