Answer the question
In order to leave comments, you need to log in
How to port script from bash to powershell?
Given: me, who writes tolerable scripts in bash/cmd and up to this point has diligently ignored OOP. I'm an admin, so don't swear.
There was a problem porting a script from bash to powershell. And something already on the fourth line I howled.
With date operators, as well as with for and if, it’s generally a problem ... to apply them at once, you need to learn the basics of the entire language, and this is very long, and greatly interferes with performance, and the script must be handed over ...
#создание переменной "ID виртуальной машины", путем получения ее из метаданных, доступных по протоколу tcp/ip. Портировал в powershell самостоятельно.
export INSTANCE_ID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
# создание переменной "ID раздела жесткого диска", путем отсеивания из таблицы нужных строк по паттерну и отображения только нужного столбца. Портировал в powershell самостоятельно.
export INSTANCE_EBS_VOL=`/usr/local/bin/aws ec2 describe-volumes | grep $INSTANCE_ID | awk '{ print $7}'`
#создание снапшота. Тут вроде без трудностей
/usr/local/bin/aws ec2 create-snapshot --volume-id $INSTANCE_EBS_VOL
# Цикл. Переменную $snapshot получаем способом, аналогичным описанному выше — в таблице describe-snapshots ищем совпадение с паттерном $INSTANCE_EBS_VOL | сокращаем количество пробелов до одного | заменяем все пробелы на запятые (это костыли, чтобы for обрабатывал не каждое слово, а строку целиком)
for snapshot in `/usr/local/bin/aws ec2 describe-snapshots | grep $INSTANCE_EBS_VOL | awk '$1=$1' | sed 's/\ /,/g'`;
do
#получаем нужную строку, заменяем запятые на пробелы обратно (см. костыль), выводим нужный нам столбец
snapid=`echo $snapshot | sed 's/,/\ /g' | awk '{ print $6 }'`
#получаем нужную строку, заменяем запятые на пробелы обратно (см. костыль), выводим нужный нам столбец. Ну и тут еще во всех строчках удаляем паттерн .000Z
snapdate=`echo $snapshot | sed 's/,/\ /g' | awk '{ print $7 }' | sed 's/.000Z//g'`
#преобразовываем дату, полученную в переменной выше к дате unix-формата (количество секунд с 00:00:00 1970-01-01 UTC)
snaptime=`date --date $snapdate +%s`
#какая-то константа. Эталонная дата, с ней нужно сравнивать остальные
datefromrecipe=2014-06-05
#Преобразовали эталонную дату в UNIX-формат (см. выше)
correctday=`date --date $datefromrecipe +%s`
#Математическая операция вычитания. Разница между эталоном и датой снапшота, полученной выше
timediff=$[ ($correctday - $snaptime) ]
#если разница между эталоном и датой снапшота будет больше, чем 86400 секунд (1 сутки), то
if [ $timediff -lt 86400 ]
then
echo "$snapid will be deleted"
#удаляем снапшот, имя которого получено из переменной выше
/usr/local/bin/aws ec2 delete-snapshot --snapshot-id $snapid
fi;
done
Answer the question
In order to leave comments, you need to log in
Thanks to everyone that already on my second question, how to hammer a nail with a hammer, he answers in detail that it is better to use a microscope. But for those who suffer, I’ll still lay out what I myself came to for a whole day of digging:
$EC2_HOME="C:\ec2-api-tools\ec2-api-tools-1.7.1.0\bin"
$INSTANCE_ID=(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
$INSTANCE_EBS_VOL=cmd /c $EC2_HOME\ec2-describe-volumes | select-string -pattern $INSTANCE_ID | %{ $_.ToString().split(”`t“)[1] }
cmd /c $EC2_HOME\ec2-create-snapshot $INSTANCE_EBS_VOL
$snapget=cmd /c $EC2_HOME\ec2-describe-snapshots | select-string -pattern $INSTANCE_EBS_VOL
Foreach ($snapshot in $snapget) {
$snapid=$snapshot | %{ $_.ToString().split("`t")[1] }
$snapdate=$snapshot | %{ $_.ToString().split("`t")[4] }
$snaptime=Get-Date -date $snapdate -UFormat %s
$correctdate=(Get-Date).adddays(-90)
$correcttime=Get-Date -date $correctdate -UFormat %s
$timediff= $correcttime - $snaptime
if (86400 -le $timediff)
{
echo "$snapid will be deleted"
echo $EC2_HOME\ec2-delete-snapshot $snapid
cmd /c $EC2_HOME\ec2-delete-snapshot $snapid
}
}
Can you tell me what your script does?
In the second line you call /usr/local/bin/aws with parameters, is this utility ported under Windows so that it can be run in the same way?
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question