如何在Register-SSMTaskWithMaintenanceWindow中嵌入PowerShell代码?
如何在SSM维护窗口任务中嵌入PowerShell代码
我来帮你搞定这个问题——其实用Register-SSMTaskWithMaintenanceWindow注册任务时,嵌入PowerShell代码的方式比你尝试的更直接,不需要手动实例化MaintenanceWindowTaskParameterValueExpression,直接用哈希表就能搞定。下面分两种常用方案给你演示:
方案1:直接嵌入PowerShell代码(适合短脚本/单行命令)
你可以直接把PowerShell代码作为Commands参数的值(字符串数组)传给任务,SSM会在目标实例上执行这些代码。如果是多行代码,用数组元素拆分或者Here-String都可以:
示例1:拆分多行代码为数组元素
# 预先定义你的变量 $newtarget = "你的窗口目标ID" $newmw = "你的维护窗口ID" # 构造任务参数:直接写PowerShell代码 $taskParams = @{ Commands = @( "Write-Host '开始执行维护任务'" # 这里写你的业务代码,比如重启服务、清理文件等 "Get-Service -Name 'wuauserv' | Restart-Service" "Write-Host 'Windows更新服务已完成重启'" ) } # 注册维护窗口任务 $newtask = Register-SSMTaskWithMaintenanceWindow ` -WindowId $newmw ` -ServiceRoleArn "arn:aws:iam::xxxxxx:role/你的SSM服务角色ARN" ` -MaxConcurrency 1 ` -MaxError 1 ` -TaskArn "AWS-RunPowerShellScript" ` -Target @{ Key="WindowTargetIds"; Values=$newtarget } ` -TaskType "RUN_COMMAND" ` -Priority 10 ` -Parameters $taskParams
示例2:用Here-String写复杂多行代码
如果代码逻辑复杂,用Here-String可以避免频繁拆分数组,注意要转义代码里的$符号,防止PowerShell提前解析变量:
$psScript = @" Write-Host '开始执行复杂维护任务' # 转义$符号,避免被本地PowerShell解析 `$diskUsage = Get-PSDrive -Name C if (`$diskUsage.Used / `$diskUsage.Free * 100 -gt 80) { Write-Host 'C盘使用率超过80%,开始清理临时文件' Remove-Item -Path 'C:\Temp\*' -Recurse -Force -ErrorAction SilentlyContinue } Write-Host '维护任务执行完成' "@ $taskParams = @{ Commands = @($psScript) } # 注册任务的代码和上面一致,这里省略重复部分
方案2:执行外部PS1文件(适合长脚本/版本化的代码)
如果你的脚本已经保存在实例本地或者S3存储桶里,可以通过Commands调用PowerShell执行这个文件:
场景A:执行实例本地的PS1文件
$taskParams = @{ Commands = @("powershell.exe -ExecutionPolicy Bypass -File 'C:\Scripts\你的维护脚本.ps1'") }
场景B:从S3下载并执行PS1文件
如果脚本存在S3,先下载到实例临时目录再执行:
$taskParams = @{ Commands = @( "Invoke-WebRequest -Uri 'https://s3.amazonaws.com/你的存储桶名/Scripts/维护脚本.ps1' -OutFile 'C:\Temp\维护脚本.ps1'" "powershell.exe -ExecutionPolicy Bypass -File 'C:\Temp\维护脚本.ps1'" ) }
关键注意点
- 不需要手动创建
MaintenanceWindowTaskParameterValueExpression对象:AWS PowerShell模块会自动把你传入的哈希表转换为对应的API模型参数,简化了代码。 - 执行策略:如果实例的PowerShell执行策略限制较严,记得加上
-ExecutionPolicy Bypass参数,避免脚本被阻止执行。 - 权限:确保SSM服务角色有足够权限访问S3(如果用S3下载脚本),同时目标实例的SSM代理有执行脚本的权限。
内容的提问来源于stack exchange,提问作者ghraz0r
相关产品推荐
相关产品推荐

