0

我正在创建一个文本文件并遍历每个 Safari 窗口、每个选项卡,并将每个链接粘贴到.txt文件中。但是,我收到了额外的missing value写入.txt文件。我知道我可以明确检查缺失值,但我不明白“空”窗口/值在哪里?

on run {input, parameters}

    (* create text file to hold links *)
    tell application "Finder" to make file at desktop with properties {name:"links_0"}
    set classicPath to (((path to desktop folder) as string) & "links_0")

    (* get links of all windows *)
    tell application "Safari"

        repeat with this_window in windows

            set the_URLs to ""  
            repeat with this_tab in tabs of this_window     
                set the_URLs to the_URLs & URL of this_tab & return     
            end repeat

            do shell script "echo " & quoted form of the_URLs & " >> " & POSIX path of (classicPath)
            do shell script "echo >> " & POSIX path of (classicPath)        
        end repeat
    end tell
    return input
end run

示例输出(2 个窗口,每个窗口有 2 个选项卡):

https://discussions.apple.com/thread/64896
https://discussions.apple.com/thread/22543

https://discussions.apple.com/thread/25140
https://discussions.apple.com/thread/22546

missing value
4

1 回答 1

0

一个更简单的方法是:

set my text item delimiters to linefeed
set fp to POSIX path of (path to desktop folder) & "links_0.txt"

close access (open for access fp) -- Create the file if it doesn't exist
# set eof of fp to 0 -- Erase any existing contents in the file

tell application id "com.apple.Safari" to tell every tab of every window ¬
        to tell (the URL as text) & linefeed to continue write it to fp ¬
        starting at eof

这当前会将 URL 附加到文件的末尾。要覆盖文件,请取消注释此行:

# set eof of fp to 0

通过删除哈希符号。


注意:阅读@user3439894 留下的评论可能会造成混淆,他在其中指出:

“它还显示了 CJK 答案中缺少的代码,其中文件在写入后应关闭。它还将相关代码包装在 try 语句中,因此如果出现错误,它会尝试关闭文件。”

我会把你在提供的链接上读到的内容加一点盐。可悲的是,Apple 的许多 AppleScript 文档包含编写不佳的代码,这也是许多不良 AppleScript 在互联网上如此普遍存在的部分原因。Apple 提供的一些文档也完全错误,这使得人们很难学习并知道该接受谁的建议。

我向您保证,我上面提供的代码非常完整。继续阅读一个非常无聊的解释,我希望我不必给出,但现在必须:

你会看到很多人这样做:

set fh to open for access filepath with write permission
write somedata to fh
close access fh

这本身并没有错,但这是使用这些读/写命令的一种非常严厉的方式,这种方式在许多人中仍然存在,仅仅是因为他们一直这样做,而且只看到它这样做了。这很麻烦而且完全没有必要1

@user3439894 暗示了一个try声明,该方法确实需要该声明。 open for access打开写入文件所必需的文件句柄。但是,如果脚本在写入过程中发生错误,则文件句柄将悬空,因为脚本在能够访问close access文件之前终止。解决这个问题的方法是使用一个try旨在捕获错误的语句,并确保close access命令仍然被执行:

try
        set fh to open for access filepath with write permission
        write somedata to fh
        close access fh
on error
        close access fh
end try

open for access并且close access是多余的。没有必要使用它们,事实上,它们的使用只会产生一个潜在的问题,然后需要一种变通方法才能解决。

write--and --read单独使用是安全且可取的,它们不需要try块来捕获潜在的错误。那么为什么我刚才称为冗余的两个命令会出现在我的脚本中呢?

close access (open for access fp)

该命令的一个很好的副作用open for access是,如果一个文件尚不存在,它将在指定路径上创建一个文件。这非常有用,因为它不需要调用系统事件或(颤抖)Finder来为您执行此操作。它似乎还有更广泛的范围来在其他 AppleScript 应用程序在沙盒等情况下无权访问的位置创建文件。

一旦open for access创建了文件——或者打开了一个已经存在的文件——它返回一个对文件句柄的引用。然后close access用于立即销毁文件句柄,因为我们实际上对它没有任何用处,而且也不希望它保持打开状态。也不需要try块:在创建文件句柄期间可能出现的任何错误都会这样做,这意味着不会创建文件句柄,因此不能保持打开状态。


1现在写出数据的方式与首次引入这些命令时的写出方式根本不同,以前,write如果不先显式打开文件句柄并声明需要写权限。现在,一切都在write命令本身内处理,包括清理。

于 2020-06-16T07:11:38.443 回答