web-dev-qa-db-ja.com

サブフォルダの親のパスを取得する:Applescript

Applescriptでコーディングされたアプリケーションにフォルダをドロップするときに、サブフォルダの親フォルダのパスを取得したい

したがって、デスクトップ上にある「Test1」というフォルダをドロップすると、

スクリプトで「Test1」の親パスとして「/ Users/username/Desktop /」を指定したいと思います。これは私のコードです:

on open the_dropped_folder

tell application "Finder"

 set FolderPath to the_dropped_folder
 set ParentPath to container of FolderPath
 set thepath to POSIX path of ParentPath

end tell
end open

これはスローされ、次のようにエラーが発生します。

"{エイリアス" Mac HD:Users:username:Desktop:Test1: "}のクラスctnrを取得できません

どうすればこれを達成できるか考えていますか?

1
smokinguns

open handler のパラメータは、aliasオブジェクトのlistを取得します1。エラーメッセージの中括弧({})は、リストオブジェクトを操作しようとしたときにエラーが発生したことを示します。

したがって、リストの代わりに単一のアイテムを操作するには、set FolderPath to first item of the_dropped_folderのようなものを使用する必要があります(そして、「読みやすく」なるように、パラメーターに複数の名前を付ける必要があります)。これで、set ParentPath to container of FolderPathステートメントが正しく機能するはずです。

ただし、次のステートメントはおそらく失敗します。 ParentPathは、Finderfolderオブジェクトであり、POSIX pathプロパティはありません。通常、この問題を回避する最も簡単な方法は、Finderにそのitemオブジェクトを変換させることです(folderitemのサブクラスです) aliasオブジェクトに挿入し、そのPOSIX pathを抽出します(aliasオブジェクトにはPOSIX pathプロパティがあります)。

これらすべてをまとめると、次のような結果になる可能性があります。

on open someDroppedAliases
    set theAlias to first item of someDroppedAliases
    tell application "Finder"
        set parentFolder to container of theAlias
        set parentFolderAlias to parentFolder as alias
    end tell
    set parentFolderPath to POSIX path of parentFolderAlias
    display dialog "Path of container:" default answer parentFolderPath
end open

すべての中間変数なし:

on open someDroppedAliases
    tell application "Finder" to ¬
        set parentFolderPath to POSIX path of ¬
            (container of first item of someDroppedAliases as alias)
    display dialog "Path of container:" default answer parentFolderPath
end open

または、システムイベントitemオブジェクトには実際にはPOSIX pathプロパティがあります):

on open someDroppedAliases
    tell application "System Events" to ¬
        set parentFolderPath to POSIX path of ¬
            container of first item of someDroppedAliases
    display dialog "Path of container:" default answer parentFolderPath
end open

注:私のバージョン(または元の定式化)には、フォルダーの処理に固有のものはありません。同じプログラムがドロップされたファイルを処理し、そのコンテナを生成します。


1 技術的には、SnowLeopardの«class bmrk»オブジェクトであり、ほとんどの場合、適切なaliasオブジェクトのように機能します(ただし、実際のaliasオブジェクトとは いくつかの違い )。

2
Chris Johnsen

これは別の便利な例です(私のような若いプレーヤーによくある罠のように見えるものを説明するために上記を要約しました。括弧が重要であることに気づいていませんでした)。

TmpItemがドロップレットにドロップされたファイルであるとしましょう。あなたはアプリケーション「ファインダー」に...

宛先をtmpItemのPOSIXパスに設定します-これは機能します

宛先をtmpItemのコンテナのPOSIXパスに設定します-これは失敗します

宛先をtmpItemのコンテナのPOSIXパスにエイリアスとして設定します-これは失敗します

宛先を(エイリアスとしてのtmpItemのコンテナ)のPOSIXパスに設定します-これは成功します

1
Paul R Martin