[macOS翻译]第 21.4 节 标准脚本添加命令

90 阅读19分钟

本文由 简悦 SimpRead转码, 原文地址 books.gigatux.nl

Tiger(Mac OS X 10.4)标准安装中的脚本附加命令都是 i......

21.4. 标准脚本添加命令

Tiger (Mac OS X 10.4) 标准安装版中的脚本附加命令均由 StandardAdditions 脚本附加命令实现。你可以查阅 StandardAdditions 字典,了解其中包含的命令及其语法细节。不过,我将列出所有命令,并提供一些基本解释和注释(以及示例),这些解释和注释超出了字典的范围。对于大多数命令,我或字典中可能会说 "字符串 "的地方,你应该理解为 "或 Unicode 文本",因为 StandardAdditions 已经进行了全面修订,以便精通 Unicode。

(关于加载脚本、存储脚本和运行脚本,请参阅第 8 章中的"编译脚本文件作为脚本对象"。关于 POSIX 文件类,请参见第 13 章 中的"文件和别名 "和第 14 章 中的"文件强制"。关于 shell 脚本,请参阅第 25 章。有关数字中枢脚本、文件夹操作和 CGI 事件,请参阅第 27 章。)

21.4.1. 对话框

这些添加脚本的命令会显示对话框,从而提供少量的用户交互。对话框将显示在当前目标应用程序中,如果没有目标应用程序,则显示在主机应用程序中。在不允许用户交互的环境中(例如在 Unix osascript 命令中),不应使用这些对话框。请注意(摘自第 19 章中的"错误"),当用户在这些对话框中单击 "取消 "按钮时抛出的-128("用户取消")错误,如果它一直渗透到 AppleScript 中,通常不会导致错误对话框(尽管它会导致脚本过早终止)。

display dialog

一般信息、文本输入和按钮选择对话框

这是一个非常灵活的小命令。您可以设置一个信息对话框。它可以有一个图标和标题。它可以包含一个用户文本输入框;用户文本可以选择以子弹形式显示(用于输入密码等)。您可以指定最多三个按钮的名称,指定哪个是确定按钮(响应 Return),哪个是取消按钮(响应 Esc 或 Command-Period,产生错误 -128),并了解用户按了哪个按钮。如果用户没有响应,可以将对话框设置为超时,这样就可以知道发生了什么。默认情况下,按钮为 "取消 "和 "确定";名为 "取消 "的按钮默认为取消按钮。返回一条记录。

示例

set r to display dialog "Quick! Pick a Pep Boy!" buttons {"Mannie", "Moe", "Jack"} ¬
    with icon caution giving up after 3
set favoritePepBoy to button returned of r
if favoritePepBoy is "" and gave up of r then set notFastEnough to true
set whoIsIt to text returned of (display dialog "What is your name?" ¬
    default answer "" buttons {"OK"} default button "OK")

display alert

信息对话框

从语法上讲,它是显示对话框的简化版本;没有用户文本输入。与显示对话框相比,该对话框的外观更像 Cocoa;可以有标题文本和较小的信息文本,图标也具有主机应用程序的适当外观。默认情况下只有一个按钮("确定"),而且总有一个默认按钮(默认情况下最右边的按钮)。名为 "取消 "的按钮不会自动成为取消按钮。第三个(最左侧)按钮与其他按钮有间隙。返回记录。(老虎版中的新功能)

示例

tell application "Finder"
    display alert "Pep Alert" message "Mannie, Moe, and Jack welcome you."
end tell

choose from list

列表框选择对话框

显示字符串或数字的滚动列表,供用户选择。返回所选字符串或数字的列表,如果用户取消,则返回 false(不是错误!)。有两个按钮,可以设置它们的标题;还可以添加提示和窗口标题。您还可以指定是否允许多选和/或空选。

示例

set p to choose from list {"Mannie", "Moe", "Jack"} with prompt "Pick a Pep Boy:"

choose file

文件选择对话框

显示标准的 "打开文件 "对话框,标题为 "选择文件",默认按钮为 "选择"。可以添加提示;可以设置显示的初始文件夹。可以指定是否显示不可见文件,是否将包视为文件夹,以及要显示的文件类型(可以是四字母文件类型代码列表,也可以是UTIssee developer.apple.com/macosx/unif… ,但不能同时显示这两种类型)。返回别名。

示例

set f to choose file of type {"public.text"} without invisibles

choose folder

文件夹选择对话框

弹出标准的 "选择文件夹 "对话框,标题为 "选择文件夹"。用户也可以创建新文件夹。您的选项与选择文件类似。返回别名。

示例

set f to choose folder with prompt "Pick a folder:"

choose file name

文件保存对话框

显示标准的保存文件对话框(默认按钮为 "保存"),标题为 "选择文件名",默认提示为 "指定新文件名和位置"。用户也可以创建新文件夹。如果用户指定了一个现有文件,则会出现 "替换?可以设置初始文件夹、初始文件名和提示。返回文件 URL(显示为文件指定符)。实际上不会保存任何内容。

示例

set f to choose file name with prompt "Where shall I save this stuff?"

choose application

应用程序选择对话框

显示标准的 "选择应用程序 "对话框,列出所有应用程序,标题为 "选择应用程序",默认提示为 "选择一个应用程序"。用户可以切换到标准的 "打开文件 "对话框中浏览。可以指定窗口标题和提示。如果允许多选,则返回应用程序指定符,或可选别名,或返回一个列表。

示例

set theApp to choose application as alias
tell application "Finder"
    set isScriptable to has scripting terminology of theApp
end tell
if isScriptable then display dialog "It's scriptable!"

choose URL

URL 选择对话框

显示标准的 "选择 URL "对话框(带 "连接 "按钮);该对话框类似于 Finder 的 "连接到服务器 "对话框,用于查找本地网络中的服务器,并提供一个选项让用户选择不同类别的服务器。用户也可以直接键入 URL,除非你阻止;基本上可以是任何字符串。实际上不会连接!返回一个字符串。

示例

choose URL showing File servers -- "afp://duck.local."

choose remote application

远程应用程序选择对话框

弹出标题为 "Choose Remote Application(选择远程应用程序)"的对话框和两个窗格,其中一个窗格用于选择本地计算机或输入 IP 号,另一个窗格用于默认提示 "Select an application(选择应用程序)"。目标计算机必须在 "共享 "系统偏好设置中打开 "远程 Apple 事件"。我无法让本地机器选择正常工作(本地机器的 Bonjour 名称会自动列出),但使用 IP 号码可以,Bonjour 名称也可以手动输入。您可以提供标题和提示。返回适合远程定位应用程序的 eppc URL 字符串;参见 Chapter 23。(老虎版新增)。

示例

choose remote application
-- application "Finder" of machine "eppc://192.168.0.4/?uid=501&pid=178"
using terms from application "Finder"
    set ap to choose remote application -- I choose Finder on remote machine
    -- username/password dialog appears, I fill it out
    tell ap
        get name of window 1 -- Desktop
    end tell
end using terms from

choose color

颜色选择对话框

弹出一个标准的颜色选择对话框,用户可以在此选择一种颜色。您可以指定最初选择的颜色。返回颜色。颜色用 rgb 颜色表示,它是由代表红、绿、蓝三部分的三个整数组成的列表。

示例

choose color default color {9000, 10000, 50000} -- {50000, 9000, 10000}

21.4.2. 声音

这些命令用于产生声音和修改声音设置。

beep

播放系统提示音。可选择使用一个整数来表示蜂鸣声的次数。

示例

beep

get volume settings

声音响度报告

以记录的形式报告声音输出、输入和警报音量的响度。

示例

alert volume of (get volume settings) -- 75

set volume

声音响度设置

设置声音输出、输入和警报音量的响度。

示例

set volume output volume 100 alert volume 100
beep

say

文本转语音

实时朗读文本或将合成语音保存为声音文件。还可与语音识别结合使用,以确定麦克风窗口下方显示的文本内容。

示例

tell application "SpeechRecognitionServer"
    set s to listen for {"yes", "no"} with prompt "Would you like me to beep?" ¬
        giving up after 10
end tell
if s is "yes" then
    say "Okay, I will beep now." displaying "Okay."
    beep
else
    say "Okay, then I won't." displaying "Okay."
end if

21.4.3. 文件和机器信息

以下命令提供有关文件或系统的信息。

system info

系统信息

返回基本系统信息记录,如计算机名称、CPU 速度和类型、以太网地址等(Tiger 版新增)。如果所需信息不在此记录中,请使用更通用(但更难使用)的系统属性命令。

示例

set v to system version of (system info)
display dialog "You are running system " & v & "!"

system attribute

格式塔和环境变量

返回 gestalt 选择器的值(参见 developer.apple.com/documentati… )。

示例

set n to system attribute "sysv"
set s to "print sprintf \"%lx\", " & n
set v to do shell script "perl -e " & quoted form of s
set L to characters of v
set v to "." & item -1 of L
set v to "." & item -2 of L & v
set v to ((items 1 thru -3 of L) as string) & v
display dialog "You are running system " & v & "!"

还可以返回用户环境变量的值(示例参见 Chapter 25 )。要了解它们的值,请执行不带参数的 system attribute 命令。

示例

system attribute "SHELL" -- "/bin/bash"

path to

标准文件夹位置

定位各种标准文件夹,如系统文件夹。如果指定的文件夹合法但不存在,path to 命令会静默创建该文件夹,除非指定 without folder creation(不创建文件夹),在这种情况下,如果文件夹不存在,将返回错误信息。如果标准文件夹未列为枚举器,则可以使用其四字母代码(参见 developer.apple.com/documentati… )。如果需要,将返回别名或字符串(或 Unicode 文本,但字典没有记录这一事实)。

示例

path to desktop -- alias "feathers:Users:mattneub:Desktop:"
path to "cmnu" -- alias "feathers:Library:Contextual Menu Items:"

path to

应用程序和脚本文件位置

按名称查找应用程序,包括当前应用程序(宿主应用程序)。如果应用程序使用 Cocoa 脚本,则启动该应用程序(我认为这是一个错误)。路径给我 "这一特殊短语本应给出当前编译脚本文件的别名,但在过去这并不可靠;在 Tiger 中情况有所好转,但仍可能出错,这取决于脚本运行环境和脚本文件格式(脚本捆绑很成问题),而且在脚本编辑器中不起作用(在脚本调试器中正常)。

示例

path to application "Finder"
-- alias "feathers:System:Library:CoreServices:Finder.app:"

path to resource

资源包资源位置

定位 bundle 的 Resources 文件夹中的文件。主要用于脚本捆绑包和 applet 捆绑包(以及 AppleScript Studio 应用程序),这样它们就能看到自己的内部;在脚本编辑器中不起作用,但在脚本调试器中运行良好。你可以选择指定要查看的捆绑包(如应用程序)以及捆绑包中的子文件夹。

示例

display dialog ((path to resource "description.rtfd") as string)
-- feathers:Users:mattneub:Library:Scripts:myScriptBundle.scptd:Contents:
    Resources:description.rtfd
set f to path to resource "app.icns" in bundle ¬
    alias "feathers:Applications:Mail.app:"
display dialog "Time to check your mail!" with icon f

list disks

卷名称

获取所有已挂载卷的名称。返回字符串列表(指 Unicode 文本)。

示例

list disks -- {"feathers", "gromit", "Network"}

list folder

文件夹内容

获取文件夹内所有项目的名称。如果没有阻止,则包括不可见的文件和文件夹。返回字符串列表(指 Unicode 文本)。

示例

list folder (path to home folder)
-- {".bash_history", ".CFUserTextEncoding", ".DS_Store", ".ssh", ...}

info for

文件/文件夹信息

获取磁盘上某个项目的信息。返回包含有用信息的文件信息记录。如果您要求获取文件夹的信息,脚本可能需要一些时间来运行,以便汇总文件夹中所有文件的大小;您可以使用不含大小的说法来避免这种情况。

示例

set uf to (path to home folder as string)
set L to list folder uf
set s to {}
repeat with f in L -- collect sizes of all items
    set end of s to size of (info for file (uf & f))
end repeat
set maxItem to 0
set maxVal to 0
repeat with i from 1 to (count s) -- find biggest size
    if item i of s > maxVal then
        set maxItem to i
        set maxVal to item i of s
    end if
end repeat
display dialog "The biggest thing in your home folder is: " & item maxItem of L

21.4.4. 文件数据

这些命令执行文件数据的顺序读写。(顺序 "是指每次读取或写入都将在同一会话中最后一次读取或写入的字符之后开始(默认情况下)。

open for access

打开文件

打开文件进行读取访问,也可选择进行写入访问,如果文件不存在,则将其创建为文本文件(即使只打开文件进行读取访问,也会这样做;我认为这是一个错误)。返回一个文件参考号,可与其他命令一起使用。

示例

set f to (path to desktop as string) & "newfile.txt"
set ff to open for access file f
close access ff

read

读取数据

从文件读取数据,可选择将其视为指定的数据类型(示例见 Chapter 13 中的 "形成 Unicode 文本");默认为字符串(非 Unicode 文本)。可以选择从哪里开始(字符位置值从 1 开始)、读取多少字符以及在哪里停止。using 定界符参数的说明不充分:这是一个单字符字符串列表,其中任何一个字符串都会被用来将数据分解为单层字符串列表(其中缺少所有定界符)。在以字符串形式读取数据时,until 和 before 参数如果超出了基本 ASCII 范围(超过 128),就会失效,但它们在使用 Unicode 文本时可以正常工作。

示例

set f to (path to desktop as string) & "someUTF16file.txt"
set ff to open for access file f
set d1 to read ff as Unicode text
d1 -- "Mannie¬Moe¬Jack"
-- testingdelimiter parameter
set notsign to "¬" as Unicode text
set L to read ff from 1 as Unicode text using delimiter notsign
L -- {"Mannie", "Moe", "Jack"}
-- testingbefore parameter
set d2 to read ff from 1 as Unicode text before notsign
close access ff
d2 -- "Mannie"

write

写入数据

将数据写入文件,并可选择将其视为指定的数据类型;这样,你就可以在文本文件中存储任何类型的数据,并在稍后检索(如果你在写入和读取时指定了相同的类,就能正确读取)。您可以选择从哪里开始写入以及写入多少数据;在文件末尾写入会追加数据,但在文件中间写入会覆盖现有数据(不会插入数据)。

示例

set f to a reference to file ((path to desktop as string) & "justTesting")
open for access f with write permission
write {"Mannie", "Moe", "Jack"} as list to f
close access f
open for access f
set L to read f as list
close access f
L -- {"Mannie", "Moe", "Jack"}

get eof

获取文件结束位置

返回文件最后一个字符的索引(也是文件的大小)。由于字符位置值从 1 开始,而 eof 是最后一个字符的位置,因此如果要追加文件,必须从比 eof 大 1 的位置开始写入(这是允许开始写入的最大位置)。

示例

write "Howdy" to f
set ourEof to get eof of f
write "Doody" to f starting at ourEof + 1

set eof

设置文件结束位置

设置文件大小,截断数据或用零填充多余部分。要替换现有文件的数据,请在写入文件前将其 eof 设置为 0。

close access

关闭文件

关闭文件。一定要关闭已打开供访问的文件!

文件数据命令可以让你描述要操作的文件,既可以是打开访问返回的文件参考号,也可以是文件指定符或别名。在前面的读取示例中,我捕获了一个文件参考号,并一直使用它;而在写入示例中,我从文件指定符开始,并使用它。开放访问命令也会使用路径名字符串,但其他命令不会。因此,这样就可以了:

set f to open for access ((path to desktop as string) & "testing")
close access f

这样也行

set f to ((path to desktop as string) & "testing")
open for access f
close access alias f

但这样不行

set f to ((path to desktop as string) & "testing")
open for access f
close access f
-- error: Can't make "feathers:Users:mattneub:Desktop:testing" into type file

你应该确保有足够的错误处理能力,以免让文件处于打开状态(与迄今为止的所有示例不同!)。如果不小心打开了文件,可能需要退出当前应用程序(如脚本编辑器)才能关闭它。脚本调试器可以帮你解决这个问题;它会在你打开文件时发出通知,并允许你在不退出的情况下关闭文件。

在本例中,我们使用 AppleScript 构建一个微型 "数据库"。我们有一些字符串;利用写入命令的起始参数,我们将每个字符串写入一个 32 个字符的 "字段"。注意谨慎的错误处理:

set pep to {"Mannie", "Moe", "Jack"}
set f to (path to current user folder as string) & "testFile"
try
    set fNum to open for access file f with write permission
on error
    close access file f
    return
end try
try
    set eof fNum to 0 -- erase if exists
    set eof fNum to (count pep) * 32
    repeat with i from 1 to (count pep)
        write item i of pep to fNum starting at (i - 1) * 32
    end repeat
    close access fNum
on error
    close access fNum
end try

现在,我们将从 "数据库 "中获取数据。"所有不属于字符串的数据都是空的。

set f to choose file of type "TEXT"
try
    set fNum to open for access f
on error
    close access f
    return
end try
set L to {}
try
    set ct to (get eof fNum) / 32
    repeat with i from 1 to ct
        set end of L to read fNum from (i - 1) * 32 ¬
            before ASCII character 0 --  read up to but not including null
    end repeat
    close access fNum
on error
    close access fNum
end try
L -- {"Mannie", "Moe", "Jack"} 

21.4.5. 字符串和剪贴板

这些命令提供字符串相关信息或使用剪贴板。

ASCII character

数字转字符

将 ASCII 数值转换为单字符(MacRoman)字符串。

示例

ASCII character 82 -- "R"

ASCII number

字符转换为数字

将(MacRoman)字符串的第一个字符转换为 ASCII 数值。

示例

ASCII number "Ribbit" -- 82

offset

子串位置

报告目标字符串中子串的位置。如果未找到子字符串,则返回 0。以前会考虑大小写并忽略关键字,这与 AppleScript 本身的默认值相反;在 Panther 中,这一点已得到修正,并且会遵守字符串考虑因素(参见 Chapter 19 中的"字符串考虑因素")。

示例

offset of "bb" in "Ribbit" -- 3

summarize

内容摘要

摘要字符串或文本文件的内容,类似于摘要服务。

set the clipboard to

设置剪贴板

将数据放入剪贴板。

clipboard info

描述剪贴板

以类大小对列表的形式描述剪贴板的内容。

示例

-- user has copied a file's icon in the Finder
clipboard info
-- {{string, 20}, {«class ut16», 44}, {«class hfs », 80}, {«class
 utf8», 20}, {Unicode text, 42}, {picture, 2616}, {«class icns», 43336},
{«class furl», 62}}

the clipboard

获取剪贴板

获取剪贴板文本,也可以指定其他类。一个常用的技巧是指定为记录;在生成的记录中,项的名称就是它们的类,值就是它们的值。

-- user has copied a file's icon in the Finder
set r to the clipboard as record
-- {string:"Hawaii Itinerary.pdf", «class ut16»:"Hawaii Itinerary.pdf",
«class hfs »:«data hfs 0000...0000», «class utf8»:"Hawaii
Itinerary.pdf", Unicode text:"Hawaii Itinerary.pdf", picture:«data PICT0A38...000FF»,
 «class icns»:«data icns6963...0000», «class furl»:file
"feathers:Users:mattneub:Desktop:Hawaii Itinerary.pdf"}
type identifier of (info for «class furl» of r) -- "com.adobe.pdf"
the clipboard as «class furl» -- works too

21.4.6. 数字和日期

这些命令为 AppleScript 添加了一些额外的算术和日期时间功能。

round

四舍五入

以各种方式将实数舍入为整数(其中一种方式称为学校教授的四舍五入,表明 AppleScript 很有幽默感)。

示例

round 1.3 -- 1

random number

生成随机数

生成一个随机数。默认情况下,它是一个介于 0 和 1 之间的实数,但你也可以指定一个不同的上限或两个上限。如果您指定的每个数字都是整数,生成的结果就是一个整数,可以是任意一个边界;否则就是一个实数。您可以为生成器播种,使其启动;这对生成固定的伪随机序列很有用。

示例

random number
set L to {}
repeat 10 times
    if (random number 1) as boolean then
        set end of L to "heads"
    else
        set end of L to "tails"
    end if
end repeat
L -- {"heads", "tails", "heads", "heads", "heads",
     "tails", "heads", "heads", "heads", "heads"}

current date

现在

生成与当前日期和时间相对应的日期对象。

示例

time string of (current date) -- "10:41:13 AM"

time to GMT

时区

报告通过 "日期和时间 "首选项窗格设置的时区,与格林威治标准时间的偏移量,以秒为单位。

示例

(time to GMT) / hours -- -7.0

21.4.7. 杂项

这些是我无法归类的脚本附加命令。

delay

等待

暂停指定秒数。从 Panther 开始,这个数字可以是实数。

示例

delay 1
beep

mount volume

AppleShare

挂载 AppleShare 卷(打开个人文件共享的机器)。该机器以 afp URL 字符串的形式指定,如选择 URL 命令返回的 URL 字符串。为避免出现选择特定加密卷的对话框,可将加密卷名称添加为第二个路径元素。为避免对话框询问用户名和密码,可将它们作为参数或 URL 的一部分提供。可以使用 smb URL 挂载 Windows 服务器。返回文件 URL(但如果卷已挂载,则无结果)。如果挂载卷命令的语法不够灵活,可以考虑使用 shell 脚本调用 mount_afp。

示例

-- this first one lets user choose, presents the "Select volumes to mount" dialog
set s to choose URL showing File servers
mount volume s as user name "mattneub" with password "teehee"
-- these next ones present no dialogs
mount volume "afp://matt%20neuburg:teehee@duck.local/OmniumGatherum"
mount volume "afp://duck.local/OmniumGatherum" ¬
    as user name "matt neuburg" with password "teehee"
-- this one presents username/password dialog and volume dialog
mount volume "afp://duck.local"

scripting components

列出 OSA 组件

返回已安装的 OSA 脚本组件名称的字符串列表。其中一个将是 "AppleScript"。

open location

打开 URL

给定一个 URL 字符串,使用相应的辅助应用程序打开 URL。示例请参阅 Chapter 1 中的"还原"。


www.deepl.com 翻译