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
将包含每个屏幕的记录,其中包含 origin
与 x
和 y
成员以及 size
与 width
和height
位成员。
例如,您可以通过
获得屏幕 1 的宽度
set screen1Width to width of |size| of item 1 of screenFrames as integer
这有点深入,我有点不知所措。我从未使用过 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
将包含每个屏幕的记录,其中包含 origin
与 x
和 y
成员以及 size
与 width
和height
位成员。
例如,您可以通过
获得屏幕 1 的宽度set screen1Width to width of |size| of item 1 of screenFrames as integer