2014-01-14 2 views
0

Ive играл с applescript около 2 недель, но я столкнулся с проблемой Im пытается создать applescript, который читает все имена папок на нашем сервере. Затем отображает их в выпадающем меню, чтобы я мог выбрать клиента. Проблема заключается в том, что она отображает результат как один вариант выбора в качестве большого предложения и не отделяет каждого клиента, поэтому их можно выбирать индивидуально. до сих пор у меня есть:Applescript Возвращаемый текст не разбивается

set theFolder to alias "server:" 
tell application "Finder" 
    set theText to name of theFolder & return 
    set k to 0 
    repeat with thisSubfolder in (get folders of theFolder) 
     set k to k + 1 
     set theText to theText & name of thisSubfolder & return 
    end repeat 
end tell 
set l to {theText} 
set l2 to "" 
repeat with i in l 
    set l2 to l2 & quoted form of i & " " 
end repeat 
do shell script "/Applications/CocoaDialog.app/Contents/MacOS/CocoaDialog \\ 
    standard-dropdown --title Title --text Text --items " & l2 
set {button, answer} to paragraphs of result 
if button is 1 then 
    return item {answer + 1} of l 
end if 

Большое спасибо

D

ответ

2

Когда вы сделаете это:

set l to {theText} 

Вы просто создать список одного элемента (ваша строка), что означает, что вы в конечном итоге с этим:

{"theFolder 
folder1 
folder2 
folder3 
"} 

Вы тогда повторяясь в этом «списке», пытаясь добавить пробелы между элементами. Но у вас нет списка на самом деле. У вас есть один список элементов с строками с разделителями с возвратом.

Лучший способ получить список имен папок - получить их от System Events. Обратите внимание, что в этом случае вам нужно создать список с именем первой папки в качестве единственного элемента. В противном случае операция & объединяет все вместе как строку, а не создает список.

tell application "System Events" 
    set l to (name of theFolder as list) & name of folders of theFolder 
end tell 

Есть также некоторые синтаксические вопросы, которые болят потом:

1 = "1"

CocoaDialog возвращает строку с номером кнопки: "1". Вы используете if button is 1. Для равенства это должно быть if button is "1".

Скобки используются для группировки, не скобки

Если кнопка "1", вы возвращаете item {answer + 1} of l. Я обвиняю Applescript за то, что разрешил эту работу, когда это не должно. Фактически вы создаете список с номером, который затем принуждается Applescript для индекса списка.Вот все шаги, при условии, answer 0:

  1. item {answer + 1} of l получает превратился в
  2. item {1} of {folder1, folder2, folder3}
  3. Applescript принуждают к item 1 of {folder1, folder2, folder3}
  4. Возвращаемое значение: folder1

Вот полностью обновлен версия вашего скрипта:

set theFolder to alias "server:" 
tell application "System Events" 
    set l to {name of theFolder} & name of folders of theFolder 
end tell 

set args to "" 
repeat with i from 1 to (count l) 
    set args to args & quoted form of item i of l 
    if i < (count l) then 
     set args to args & " " 
    end if 
end repeat 

do shell script "/Applications/CocoaDialog.app/Contents/MacOS/CocoaDialog \\ 
    standard-dropdown --title Title --text Text --items " & args 

set {button, answer} to paragraphs of result 
if button is "1" then 
    return item (answer + 1) of l 
end if 
+1

Огромное спасибо вам, ребята, за все ваше время и помощь. И спасибо за подробное объяснение Даррика, это было большой помощью и очень информативным. Еще раз спасибо за ваше время – user3194375

0

Измените строку:

set l to {theText} 

к:

set l to paragraphs of theText 

, и вы должны быть хорошо идти.

+0

@ Darrick-Herwehe - гораздо больше информации, я буду поддерживать это. Я принимаю решение, настаивая на том, что использование SE - лучший способ. Для меня лучший способ - сделать некоторые изменения '' cd '/ testing_folder/testhere /'; find. -maxdepth 1-type d \\ (! -name '.' \\) | sed 's/^ \\ . \\ /// '"', который получает имя каждой папки очень быстро. Тесты скорости. 1-я группа использует 6k-папки с именами «folder_1», «folder_2» и т. Д .; Вторая группа использует 6k случайно названных папок, и каждый скрипт выполняется дважды подряд. первая версия: находка: 0,07 SE: 0,54 F: 0,40 F: 0,40 SE: 0,33 находкой (Ds): 0,07 второй v: находка: +0,07 +0,06 \t SE: 0,57 0,35 \t F: 0,43 0,43 – CRGreen

+0

и, как вы можете видеть, Finder часто быстрее, чем System Events (SE) – CRGreen

+0

, и я должен добавить предостережение, которое тестирую на 10.6.8, более поздние версии ОС могут иметь отличия (с нетерпением жду тестирования). Кроме того, я случайно забыл удалить «(ds)» из одного из этих тестовых заголовков; «find» - это версия сценария do shell, «F» - Finder, «SE» - системные события. Ладно, я готов. – CRGreen

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