2014-01-14 79 views
0

我已經玩applescript約2個星期了,但我碰到了一個問題 我試圖創建一個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

許多人非常感謝你們所有的時間和幫助。感謝Darrick的詳細解釋,這非常有幫助,而且非常翔實。感謝你的寶貴時間 – 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/^ \\ 。\\ ///'「',它可以快速獲取每個文件夾的名稱。 速度測試。第一組使用具有名稱「folder_1」,「folder_2」等的6k文件夾;第二組使用6k個隨機命名的文件夾,每個腳本連續運行兩次。 第一版本: 發現:0.07 SE:0.54 F:0.40 F:0.40 SE:0.33 查找(DS):0.07 第二ν: 發現: 0.07 0.06 \t SE: 0.57 0.35 \t F: 0.43 0.43 – CRGreen

+0

,正如你所看到的,搜索通常比系統事件(SE) – CRGreen

+0

更快,我應該添加我在10.6.8測試的警告,以後的OS版本可能有差異(期待測試)。此外,我不小心忘記從這些測試「標題」中刪除「(ds)」; 「find」是do shell腳本版本,「F」是Finder,「SE」是系統事件。好了,我完成了。 – CRGreen