H
H
Hanggard2014-08-18 17:46:17
PowerShell
Hanggard, 2014-08-18 17:46:17

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

3 answer(s)
H
Hanggard, 2014-08-18
@Hanggard

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
     }
  }

A
Alexander Nikitin, 2014-08-19
@padla2k

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?

P
Pavel Mir, 2014-08-19
@facetheheat

Does it need to be ported? Try installing cygwin, most utilities are supported,
there are some syntax quirks, but it's easier than PowerShell :)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question