Задать вопрос

Как портировать скрипт из bash в Powershell?

Дано: я, который пишет сносные скрипты на bash/cmd и до этого момента старательно игнорировавший ООП. Я админ, поэтому не ругайтесь.
Возникла проблема портирования скрипта из bash в powershell. И что-то уже на четвертой строчке я взвыл.

С операторами даты, а также с for и if вообще беда… чтобы применить их на раз, необходимо учить основы всего языка, а это очень долго, и сильно мешает производительности, а скрипт надо сдавать…
#создание переменной "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
  • Вопрос задан
  • 3469 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@Hanggard Автор вопроса
Спасибо всем, что уже на второй мой вопрос, как забить гвоздь молотком, отвечает развернуто, что лучше использовать микроскоп. Но для тех, кто страждет, все же выложу то, до чего целым днем копаний дошел сам:
$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
	   }
	}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
aenikitin
@aenikitin
Инфраструктурный администратор
Расскажите хоть что делает ваш скрипт?

Во второй строке вы вызываете /usr/local/bin/aws с параметрами, данная утилита портирована под Windows что бы ее можно было так же запустить?
Ответ написан
@facetheheat
А нужно ли портировать? Попробуйте установить cygwin, большинство утилит поддерживается,
есть некоторые особенности синтаксиса, но это проще, чем PowerShell :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы