2015-07-30 4 views
0

У меня есть два разных обработчика, один из которых получает имена (такие как «1.0» и «1.1») из папок в папке, затем преобразует их в список приложений. Затем он передает этот список другому обработчику, который оценивает список и предположительно идентифицирует наибольшее число (я получил его от http://www.macosxautomation.com/applescript/sbrt/sbrt-03.html).Applescript: Получение списка пронумерованных папок из сценария оболочки и идентификация самого высокого значения

on set_values(project_path) 
do shell script "ls " & project_path 
get words of result 
set allvalues to (result) 
return allvalues 
end set_values 

Затем я перехожу результат в переменную для следующего обработчика:

set values_list to result 

И это обработчик получить наибольшее число из списка, любезно macosxautomation:

on highnum(values_list) 
set the high_amount to "" 
repeat with i from 1 to the count of the values_list 
    set this_item to item i of the values_list 
    set the item_class to the class of this_item 
    if the item_class is in {integer, real} then 
     if the high_amount is "" then 
      set the high_amount to this_item 
     else if this_item is greater than the high_amount then 
      set the high_amount to item i of the values_list 
     end if 
    else if the item_class is list then 
     set the high_value to highnum(this_item) 
     if the the high_value is greater than the high_amount then ¬ 
      set the high_amount to the high_value 
    end if 
end repeat 
return high_amount 
end highnum 

Проблема в том, что второй обработчик только когда-либо выдаёт нулевой ответ, и я не могу понять, почему. Любая помощь оценивается.

Цель приложения - упростить создание других приложений, позволяя создавать новые «проекты», импортировать существующие приложения в новый «проект» и легко разрешать редактирование «проекта». В случае, если вы решите отредактировать проект, вы можете выбрать «незначительное обновление» (эффективно добавив «0.0.1» к своей последней версии) или ряд других параметров, которые я уже закончил. Мульти-десятичное сложение можно решить, используя текстовый элемент разделители, но я не уверен, как получить мульти-десятичное число от highnum() обработчика, который является важной частью процесса

ответ

0

highnum() обработчика сравнивает real и integer, но сценарий оболочки возвращает значения string.

AppleScript имеет встроенную опцию для сравнения числовых строк.

Редактировать: считаются все значения, содержащие хотя бы одну точку и не содержащие буквы.

on highnum(values_list) 
    set high_amount to "0.0" 
    considering numeric strings 
     repeat with aValue in values_list 
      set {TID, text item delimiters} to {text item delimiters, "."} 
      set aValueItems to text items of aValue 
      if (count aValueItems) > 1 then 
       set text item delimiters to "" 
       try 
        aValueItems as text as integer 
        if aValue > high_amount then set high_amount to contents of aValue 
       end try 
      end if 
      set text item delimiters to TID 
     end repeat 
    end considering 
    return high_amount 
end highnum 

это более простая версия set_values() обработчика

on set_values(project_path) 
    return paragraphs of (do shell script "ls " & project_path) 
end set_values 

добавить версии строк вы можете использовать этот обработчик, он считает строки с разными «знаков после запятой».

set newVersionString to addVersionStrings("1.1.1", "2.0") --> 3.1.1 

on addVersionStrings(string1, string2) 
    set {TID, text item delimiters} to {text item delimiters, "."} 
    set textItems1 to text items of string1 
    set textItems2 to text items of string2 
    if (count textItems1) < (count textItems2) then 
     set minCount to count textItems1 
     set _sum to textItems2 
     set _add to textItems1 
    else 
     set minCount to count textItems2 
     set _sum to textItems1 
     set _add to textItems2 
    end if 
    repeat with i from 1 to minCount 
     set item i of _sum to (get (item i of _sum as integer) + (item i of _add as integer)) as text 
    end repeat 
    set theResult to _sum as text 
    set text item delimiters to TID 
    return theResult 
end addVersionStrings 
+0

Это работает очень хорошо, единственная проблема заключается в том, что он оценивает не-номер папки, а также и возвращает имя папки «последней» вместо «2,9», так что я добавил 'если Avalue не целое число, то \t \t \t если Avalue> high_amount затем установите high_amount к содержанию Avalue конца if' \t \t \t \t \t Я задавался вопросом, есть ли пересмотренная версия моего номера проверки части, которая будет ограничивать его только «3,0», а не включают только названные «3»? – DJpotato

+0

Я обновил сообщение, чтобы рассмотреть только значения, которые содержат точку, и конвертируются в число с плавающей запятой. – vadian

+0

Спасибо, что полностью решает мою проблему. – DJpotato

Смежные вопросы