我正在尝试编写两个单独的脚本。一个脚本确定哪些EC2实例已停止,它启动它们并将其开始记录到文本文件中。
第二个脚本将读取文本文件并停止这些实例。为了调试/简单起见,我首先将两个脚本组合成一个脚本。
这是我的剧本:
$Instances = (Get-EC2Instance).instances
$start_instances = @()
$Instances | foreach {
$state = Get-EC2InstanceStatus -InstanceId $_.InstanceId -IncludeAllInstance $true
$state = $state.InstanceState.Name
if ($state -eq "stopped"){
$start_instances += $_.InstanceId
}
}
[System.IO.File]::WriteAllText("C:\users\myusername\desktop\so.csv", $($start_instances -join ','))
$shutdown_instances = [System.IO.File]::ReadAllText("C:\users\myusername\desktop\so.csv")
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Stop-EC2Instance -Instance $shutdown_instances
启动并记录正在运行的实例正常工作。它的停止实例失败了。
我收到以下错误:
Stop-EC2Instance : Invalid id: "i-99edd755,i-8d647f58"
At C:\users\myusername\Desktop\aws-test.ps1:28 char:1
+ Stop-EC2Instance -Instance $shutdown_instances
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Stop-EC2Instance], AmazonEC2Exception
+ FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.StopEC2InstanceCmdl
那些实例ID确实有效,所以我无法弄清楚为什么它会抱怨它。我是通过out-file将实例ID写入文件并通过get-content获取,但这似乎导致了不同的错误。
我假设问题与数据格式有关,一旦我将其从文本文件中拉出来。
修改 所以我把脚本改为:
$start_instances = $start_instances | Select-Object @{Name='Name';Expression={$_}}
$start_instances | Export-Csv -Delimiter ',' -NoTypeInformation -path C:\temp\instances.csv
$stop_instances = @(Import-Csv -path C:\temp\instances.csv)
$stop_instances | Stop-EC2Instance
但仍然出现错误:
Stop-EC2Instance : No instances specified
At C:\temp\aws-test.ps1:22 char:19
+ $stop_instances | Stop-EC2Instance
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Stop-EC2Instance], AmazonEC2Exception
+ FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.StopEC2InstanceCmdlet
我也试过了:
Stop-EC2Instance -InstanceID $stop_instances
但那也死了:
Stop-EC2Instance : No instances specified
At C:\temp\aws-test.ps1:22 char:1
+ Stop-EC2Instance -InstanceId $stop_instances
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Stop-EC2Instance], AmazonEC2Exception
+ FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.StopEC2InstanceCmdlet
答案 0 :(得分:0)
InstanceId参数需要数组。
您可以先声明一个空数组
$EC2Instance =@()
然后使用Import-CSV并将其通过管道传递给空数组,并附加来自csv的每个值
Import-CSV C:\Temp\Instance.csv | Foreach-Object {$EC2Instance += $_.InstanceId}
echo $EC2Instance
$ EC2instance现在将在数组中具有所需的实例ID
然后您可以在命令中使用它
Stop-EC2instance -InstanceId $EC2instance
这对我有用。