本文介绍了在后台显示和更新applescript输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里是Applescript代码:

I have a short and sweet program that outputs my internal and external ip in applescript.

我有一个简短而甜蜜的程序,可以在appescript中输出我的内部和外部ip。

Here it is the Applescript code:

set inIP to IPv4 address of (get system info)
set exIP to (do shell script "curl ipecho.net/plain")
display dialog "Internal: " & inIP & "
External: " & exIP

我希望它在后台不断更新,最好不要在显示对话框中

I would like it to constantly update in the background and preferably not in a display dialog function as it does at the moment.

我不想要一个显示对话框不断弹出,所以我正在寻找例子,在菜单栏中显示IP。

I do not want a display dialog constantly popping up so I am looking for example, displaying the IPs in the menu bar.

我不知道这是否可以与Applescript有关

I do not know if this is possible to do with Applescript

推荐答案

p>从10.10(我想),您可以直接在脚本编辑器中使用ApplescriptOBJC创建真正的应用程序。

As from 10.10 (i Think) you can create real application using ApplescriptOBJC directly in Script Editor.

我以前没有真正尝试过,但一旦你去,它比我预期的要容易。

I have not really tried it before but once you get going it is easier than I expected.

粘贴这个代码在一个新的脚本编辑器Applescript文档中。

Paste this code in a new Script Editor Applescript document.

使用另存为... 保持打开的应用 >菜单选项。

Save it as a Stay open Application using the Save as… menu option.

然后以普通应用程序运行应用程序。

Then run the app as a normal application.

使用OP的原始应用代码

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property StatusItem : missing value

-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
    display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
    error number -128
end if

-- create an NSStatusBar
on makeStatusBar()
    set bar to current application's NSStatusBar's systemStatusBar

    set StatusItem to bar's statusItemWithLength:-1.0

    -- set up the initial NSStatusBars title
    StatusItem's setTitle:"IP"
end makeStatusBar

-- update statusBar
on displayIP(theDisplay)
    StatusItem's setTitle:theDisplay
end displayIP

--repeat run  update code
on idle

    --get the IPs
    set inIP to IPv4 address of (get system info)
    set exIP to (do shell script "curl ipecho.net/plain")

    set theDisplay to "Internal: " & inIP & " External: " & exIP

    my displayIP(theDisplay)
    return 30 -- run every 30 seconds

end idle
-- call to create initial NSStatusBar
my makeStatusBar()

应用程序设置为每30秒运行一次。
它将使用ips来更新菜单栏中的状态栏菜单。

The app is set to run every 30 seconds.It will update a status bar menu in the menu bar with your ips.

我没有检查任何错误,并留给您。

I have not put any error checking in and leave that to you.

还要记住,如果要在脚本编辑器中运行代码,请确保使用运行应用程序。

Also remember if you want to run the code while in Script Editor then make sure you use "Run Application".

更新:1
我更改了内部IP地址代码以使用NShost,它比获取系统信息更快,更可靠strong>

Update:1I have changed the internal IP address code to use NShost which is quicker and probably more reliable than the "get system info"

更新:2

更新外部代码以使用NSURL请求而不是Original Curl do shell脚本命令。

Update the external code to use a NSURL request rather than the Original Curl do shell script command.

这允许更容易的错误检查,如果由于没有网络连接而获取外部IP地址失败。 ..etc。

This allows for easier error checks if the is a failure in obtaining the external ip address due to no network connection...etc.

卷曲将返回一个完整的信息日志,说明为什么它失败并成为IM HO一个痛苦。

Curl will return a whole log of info as to why it failed and be IMHO a pain.

更新的应用程式代码

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property StatusItem : missing value

-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
    display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
    error number -128
end if

-- create an NSStatusBar
on makeStatusBar()
    set bar to current application's NSStatusBar's systemStatusBar

    set StatusItem to bar's statusItemWithLength:-1.0

    -- set up the initial NSStatusBars title
    StatusItem's setTitle:"IP"
end makeStatusBar

-- update statusBar
on displayIP(theDisplay)
    StatusItem's setTitle:theDisplay
end displayIP

--repeat run  update code
on idle

    --get the IPs

    set stringAddress to ""
    --use NSHost to get the Internal IP address
    set inIPAddresses to current application's NSHost's currentHost's addresses

    --work through each item to find the IP
    repeat with i from 1 to number of items in inIPAddresses
        set anAddress to (current application's NSString's stringWithString:(item i of inIPAddresses))
        set ipCheck to (anAddress's componentsSeparatedByString:".")
        set the Counter to (count of ipCheck)

        if (anAddress as string) does not start with "127" then
            if Counter is equal to 4 then
                set stringAddress to anAddress
                -- found a match lets exit the repeat
                exit repeat
            end if
        else
            set stringAddress to "Not available"
        end if
    end repeat

    -- Get extenal IP

    set anError to missing value
    set iPURL to (current application's NSURL's URLWithString:"http://ipecho.net/plain")

    set NSUTF8StringEncoding to 4
    set exIP to (current application's NSString's stringWithContentsOfURL:iPURL encoding:NSUTF8StringEncoding |error|:anError) as string
    if exIP contains missing value then
        set exIP to "Not available"
    end if



    set theDisplay to "Intl: " & stringAddress & " Extnl: " & exIP

    --call to update statusBar
    my displayIP(theDisplay)

    return 30 -- run every 30 seconds

end idle
-- call to create initial NSStatusBar
my makeStatusBar()






更新3

这个做法与OP中的OP一样。

This one will do as the OP asked in the comments.

它现在有一个带有两个外部或内部选项的下​​拉菜单。

It now has a drop down menu with two options External or Internal.

选择一个或另一个菜单项将更改状态bar显示所选择的IP。

Select one or the other menu item will change the status bar to show the chosen IP.

最后一个被快速抛出,所以不漂亮。 : - )

This last one was thrown together quickly so it is not pretty. :-)

更新4 它还会继续选择退出应用程序并重新启动。)

( UPDATE 4 It also persists the selection on quitting the app and relaunching. )

新代码:

  use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property StatusItem : missing value
property selectedMenu : "" -- each menu action will set this to a number, this will determin which IP is shown

property theDisplay : ""
property defaults : class "NSUserDefaults"

-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
    display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
    error number -128
end if

-- create an NSStatusBar
on makeStatusBar()
    set bar to current application's NSStatusBar's systemStatusBar

    set StatusItem to bar's statusItemWithLength:-1.0

    -- set up the initial NSStatusBars title
    StatusItem's setTitle:"IP"
    set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
    set internalMenuItem to current application's NSMenuItem's alloc()'s initWithTitle:"Internal" action:"showInternal:" keyEquivalent:""
    set externalMenuItem to current application's NSMenuItem's alloc()'s initWithTitle:"External" action:"showIExternal:" keyEquivalent:""

    StatusItem's setMenu:newMenu
    newMenu's addItem:internalMenuItem
    newMenu's addItem:externalMenuItem
    internalMenuItem's setTarget:me
    externalMenuItem's setTarget:me
end makeStatusBar

--Show Internal ip Action
on showInternal:sender


    defaults's setObject:"1" forKey:"selectedMenu"
    my runTheCode()
end showInternal:

--Show External ip Action
on showIExternal:sender


    defaults's setObject:"2" forKey:"selectedMenu"
    my runTheCode()
end showIExternal:

-- update statusBar
on displayIP(theDisplay)
    StatusItem's setTitle:theDisplay
end displayIP

on runTheCode()

    set stringAddress to ""
    --use NSHost to get the Internal IP address
    set inIPAddresses to current application's NSHost's currentHost's addresses

    --work through each item to find the IP
    repeat with i from 1 to number of items in inIPAddresses
        set anAddress to (current application's NSString's stringWithString:(item i of inIPAddresses))
        set ipCheck to (anAddress's componentsSeparatedByString:".")
        set the Counter to (count of ipCheck)

        if (anAddress as string) does not start with "127" then
            if Counter is equal to 4 then
                set stringAddress to anAddress
                -- found a match lets exit the repeat
                exit repeat
            end if
        else
            set stringAddress to "Not available"
        end if
    end repeat

    -- Get extenal IP

    set anError to missing value
    set iPURL to (current application's NSURL's URLWithString:"http://ipecho.net/plain")

    set NSUTF8StringEncoding to 4
    set exIP to (current application's NSString's stringWithContentsOfURL:iPURL encoding:NSUTF8StringEncoding |error|:anError) as string
    if exIP contains missing value then
        set exIP to "Not available"
    end if

    set selectedMenu to (defaults's stringForKey:"selectedMenu") as string
    if selectedMenu is "" or selectedMenu contains missing value then
        set selectedMenu to "1"
    end if

    if selectedMenu is "1" then
        set theDisplay to "Intl: " & stringAddress
    else if selectedMenu is "2" then
        set theDisplay to " Extnl: " & exIP
    end if

    --call to update statusBar
    my displayIP(theDisplay)


end runTheCode

--repeat run  update code
on idle

    my runTheCode()
    --my displayIP(theDisplay)

    return 30 -- run every 30 seconds

end idle
-- call to create initial NSStatusBar
set defaults to current application's NSUserDefaults's standardUserDefaults
my makeStatusBar()

这篇关于在后台显示和更新applescript输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-15 00:32