如何在AppleScript中返回列表项的名称并将列表与另一个列表匹配?

时间:2014-04-01 15:03:27

标签: list applescript match listitem

概要

  1. 我创建了所有正在运行的应用的列表(activeProcesses
  2. 我希望它与预定义的文本编辑器列表(appList
  3. 相匹配
  4. activeProcesses中的应用来自appList的应用创建新列表(activeEditorList =>第一个问题
  5. 我希望匹配activeEditorListactiveProcesses中正在运行的文本编辑器的数量
    • 匹配列表是我的第二个问题
  6. 输出或取消
    • 如果仅在appList上运行文本编辑器,我想返回它的名称
    • 如果有多个文本编辑器正在运行,请提示我从activeEditorList
    • 中选择一个
    • 如果没有正在运行取消

  7. 这是我的脚本的第一部分:从所有正在运行的应用程序中创建一个新列表。最后一块拼图丢失了。我的输出是:

    {item 1 of {"nvALT", "FoldingText", "Byword"}, item 2 of {"nvALT", "FoldingText", "Byword"}}`
    
    而不是 {"nvALT", "iTerm"}

    这是我的剧本:

    set activeEditorsList to {}
    set appList to {"nvALT", "FoldingText", "Byword"}
    
    --    Generate variable with running apps
    tell application "System Events"
        set activeProcesses to (name of every process)
    end tell
    
    --    Generate list of running text editors    
    repeat with appName in appList
        if (activeProcesses contains appName) is true then
            set activeEditor to appName
            copy appName to the end of activeEditorsList
        end if
    end repeat
    return activeEditorsList
    

    问题1:第12行set activeEditor to appName无法正常工作,我的徒劳无益的尝试也无法发挥作用。


    activeEditorsList变量准备就绪时,我想再次使用它来查明是否只有一个文本编辑器正在运行(=>返回名称)或多个正在运行(=>提示选择)列表中的一个并返回其名称。)

    这就是我想象匹配的样子:

    set appList to {"nvALT", "FoldingText", "Byword"}
    set activeEditorsList to {"nvALT", "Byword"}
    
    on count_matches(this_list, this_item)
        set the match_counter to 0
        repeat with i from 1 to the count of this_list
            if item i of this_list is this_item then ¬
                set the match_counter to the match_counter + 1
        end repeat
        return the match_counter
    end count_matches
    
    count_matches(appList, (items of activeEditorsList))
    

    问题2:上述代码的问题是,在最后一行(items of activeEditorsList)没有按照我预期的方式工作 - 尽管放"nvALT"在那里工作。


    然后我需要写一些内容...... if count_matches 0 then cancel, elif 1 return name, else prompt to choose from list

    我还不知道如何匹配计数,但我想我可以弄明白(随着时间的推移)。另一方面,提示是我已经准备好的一件小事:

    set activeEditorsList to {"nvALT", "Byword"}
    
    tell me to set selectedEditor to choose from list activeEditorsList
    return selectedEditor as text
    

    我要感谢你的一些指导。

2 个答案:

答案 0 :(得分:0)

(根据我的评论,我只会解决你的第一个问题)

我不确定set activeEditor to appName不起作用。您将变量activeEditor的值设置为应用程序的名称。这对我有用。 (我也对代码进行了一些表面的编辑。)

set activeEditorsList to {}
set appList to {"Sublime Text 2"}

tell application "System Events"
    set activeProcesses to (name of every process)
end tell

repeat with appName in appList
    if appName is in activeProcesses then
        set activeEditor to appName
        set end of activeEditorsList to appName
    end if
end repeat
activeEditor
--> {item 1 of {"Sublime Text 2"}}

如果您尝试实际激活该编辑器,则不是这样做的方法。同样,您只是分配给变量。

答案 1 :(得分:0)

添加第二个答案来解决整个脚本而不是单个问题。

对于脚本的第一部分,您只需要获取当前正在运行的预定义应用程序列表。您已经使该部分正常工作:

set activeEditorsList to {}
set appList to {"nvALT", "FoldingText", "Byword"}

--    Generate variable with running apps
tell application "System Events"
    set activeProcesses to (name of every process)
end tell

--    Generate list of running text editors    
repeat with appName in appList
    if appName is in activeProcesses then
        set end of activeEditorsList to appName
    end if
end repeat

对于第二部分,您不需要匹配任何内容。您已经使用activeEditorsList完成了该操作。你只需要使用Applescript的count命令

找出你有多少匹配并在那里工作的人
editorCount = (count activeEditorsList)
if editorCount = 1 then
    return item 1 of activeEditorsList
else if editorCount > 1 then
    return choose from list activeEditorsList
else
    -- Handle 0 items
end if

作为旁注,对于0编辑器的情况,听起来这个代码在子例程中。您可能要么抛出错误,要么返回空类型值(nullmissing value""),并取消调用该例程的脚本。