AWK、Applescript、String/Int 解析

AWK, Applescript, String/Int Parsing

这有点深入,我有点不知所措。我从未使用过 AWK,而且我越是尝试了解它(也许是时间太晚了),它就越令人沮丧。

我正在尝试编写一个 applescript... 脚本来调整 windows 在我的显示器上的大小。现在,我可以采取简单的方法并将我的监视器尺寸硬编码到脚本中,但我决定尝试动态收集它们。我已经设法找到一个代码片段来解析 plist 并吐出几乎可用的信息,这是 applescript:

set screenInfo to do shell script "defaults read /Library/Preferences/com.apple.windowserver | awk '
        BEGIN { FS=\"= \" }
        /Active/  { screens++ }
        { gsub(\";\",\"\",) }
        /^ *OriginX/ { ox[screens] =  }
        /^ *OriginY/ { oy[screens] =  }
        /^ *Width/   { w[screens]  =  }
        /^ *Height/  { h[screens]  =  }
        END       {
                for (si=1;si<=screens;si++) {
                    print ox[si],oy[si],w[si],h[si]
                    }
            }'"
    return screenInfo
end getScreenInfo

效果很好 - 在我的 "result" window 中,我得到以下信息:

"0 0 1920 1080  
\"-1600\" 0 1600 1200  
1920 0 1680 1050  
0 0 1920 1080  
\"-1600\" 0 1600 1200  
1920 0 1680 1050  
3600 1050 1024 768  "

第一对数字是显示器左上角的坐标,第二对数字是该显示器的分辨率。每个监视器都是这种情况 - 尽管监视器 1-3 有副本,外加一个幽灵监视器。我真的不关心那个,它应该是可解析的。

当我尝试将这些数字解析为整数以便我可以使用它们时,我的问题就来了 - 使用类似 set theVar to word 1 of paragraph 2 of theString as integer 的东西,它解析为 1600,而不是它需要的 -1600成为。我尝试遍历整个字符串,一次 1 个字符,以删除转义的反斜杠,但我认为这些实际上只会显示在结果中 window - 当我 display dialog 时,它们不会显示.即使我不尝试将其解析为整数,只是 word 1 of paragraph 2 它会忽略 - 和 returns "1600"。我还能如何解析这个?天哪,我现在不是 applescript 的粉丝。

您可以使用 AppleScriptObjC 获取屏幕分辨率

use framework "Foundation"

set screenFrames to {}
set screens to current application's NSScreen's screens()
repeat with aScreen in screens
    set end of screenFrames to aScreen's frame() as record
end repeat

screenFrames 将包含每个屏幕的记录,其中包含 originxy 成员以及 sizewidthheight 位成员。

例如,您可以通过

获得屏幕 1 的宽度
set screen1Width to width of |size| of item 1 of screenFrames as integer