Преобразование сценария оболочки в сценарий PowerShell

#bash #powershell

#bash #powershell

Вопрос:

Итак, у меня есть этот сценарий оболочки, и я пытаюсь преобразовать его в сценарий PowerShell

«Задача» состоит в том, чтобы прочитать текстовый файл построчно и вернуть среднее значение числа 4, связанного с именем, указанным в аргументе

Текстовый файл:

 .... ... . . . .
John Big 1 2 4 5
.... ... . . . .
 

ПРИМЕР:

 if arg is "John Big" it should give back 3
 

Сценарий оболочки:

 while read -r fname lname a b c d;
do
  x="$fname $lname"

  if [ "$x" = "$1" ]
  then
    avg=$(( (a   b   c   d) / 4 ))
    echo $avg
    break
  fi
done <class.txt
 

PowerShell:

 $TextFile = Get-Content .class.txt
foreach($line in $TextFile){
   $fname,$lname,[int]$a,[int]$b,[int]$c,[int]$d =$line.split(' ')
   $x = "$fname $lname"
   $avg = (($a   $b   $c   $d) / 4)
   if($x = $args[0]){
    echo $avg
    break
  }
}
 

Пожалуйста, помогите мне отредактировать этот сценарий PowerShell

Комментарии:

1. Поскольку у вас уже есть версия Powershell: что именно не работает? Подсказка : попробуйте $x -eq $args[0] вместо $x = $args[0]

2. Я новичок в PowerShell, и когда я запускал этот код, он всегда печатал 3 (читал только первую строку) @OcasoProtal

3. Это потому, что вы используете неправильное сравнение в своем if. Используйте -eq (сравнение) вместо = (Назначение!) сделает свое дело.

4. Я пробовал, но теперь он просто выводит аргумент @OcasoProtal

5. Просто протестировал его с исправлением, у меня все работает нормально. Как вы вызываете сценарий? Используйте кавычки вокруг аргумента : yourscript.ps1 "John Big" !

Ответ №1:

Вы использовали присваивание в своем if-условии вместо сравнения. Поэтому, когда вы заменяете это = на -eq все работает нормально:

 $TextFile = Get-Content .class.txt
foreach ($line in $TextFile) {
    # Write-Host $line
    $fname, $lname, [int]$a, [int]$b, [int]$c, [int]$d = $line.split(' ')
    $x = "$fname $lname"
    $avg = (($a   $b   $c   $d) / 4)
    # Write-Host $avg
    if ($x -eq $args[0]) {
        Write-Host $avg
        break
    }
}
 

Я использовал Write-Host вместо echo и добавил несколько (прокомментированных) строк с Write-Host для печати некоторых «отладочных данных». Просто раскомментируйте, чтобы увидеть, что происходит внутри вашего скрипта при его запуске.