5

私のアプリでは、OSX Finder にファイルまたはフォルダーをコピーさせるのが好きです。

注:シェルコマンド、NSWorkspace、またはその他の手段を使用する代わりにFinderを使用するのには十分な理由があるため、その方向での提案は必要ありません。

私は現在、Finder にコピー操作を実行するよう依頼するために Applescript に依存しています。テスト用のサンプル スクリプトを次に示します。

tell application "Finder"
    try
        copy file POSIX file "/etc/bashrc" to folder POSIX file "/private/tmp"
        -- alternative with same behavior:
        --duplicate POSIX file "/etc/bashrc" to POSIX file "/private/tmp"
    on error errmesg number errn
        display dialog "Error thrown: " & errmesg
    end try
end tell

問題は次のとおりです。目的のアイテムが既に存在する場合、スクリプトはエラーをスローし、コピー操作をキャンセルします。

ただし、次のように、Finder でインタラクティブにコピー操作を行うときに表示される「アイテムが存在します」ダイアログを Finder に表示させたいと思います。

ファインダ

さて、ここ に問題があります。このスクリプトをサードパーティ アプリのスクリプト デバッガーから実行すると、このダイアログが表示されます。

したがって、明らかに、例外をスローする代わりに Finder にダイアログを表示させる方法があります。しかし、どのように?これの秘密を誰が知っていますか?

4

3 に答える 3

1

さて、私自身のニーズに対して、私は解決策を見つけました。AppleScript を使用する代わりに、AppleEvents API を直接使用する必要があります。

そこで、の SendMode パラメータに値kAEAlwaysInteract | kAECanSwitchLayerを指定できます。AESendこれにより、ダイアログが Finder に表示されます (この場合、Finder も前面に表示されます)。

ただし、AppleScript に依存している人にとっては、残念ながらこれは解決策ではありません。

于 2014-07-06T14:13:48.583 に答える
0

AppleScript を使用している場合、少なくともスクリプトが通常の環境で実行されている場合、Finder にダイアログを表示させる方法は実際にはないようです。私のテストでは、Finderのファイル コマンドとSystem Eventsのファイルmoveコマンドの両方が、ターゲットが既に存在する場合に一貫してエラーになります。唯一の違いは、セマンティクス以外に、ターゲット ファイルが上書きされることを意味するreplacingこの動作を抑制するスイッチをFinder が提供することです。trueプロンプトは表示されませんが、これを設定するオプションはありません(まったく同じ質問の議論については、この MacScripter スレッドaskを参照してください) 。

その内部の仕組みについて十分な知識がなければ、スクリプト デバッガーがこれを異なる方法で処理するという事実は、通常の環境でスクリプトを実行していないことが原因である可能性が最も高いと推測することしかできません。独自のスクリプト実行レイヤーを作成せずに、スクリプトの内部動作にフックしてデバッガーとしての仕事を行う方法を想像するのは困難です。このような中間層は、コマンドがアプリケーションに異なる方法で転送される理由を説明するかもしれません。Finder と の場合move、ダイアログを表示する低レベルの Finder コピー ルーチンに転送されます。

Paul R が提案したように、その機能を自分で再実装するか、 AppleScript-ObjectiveCに移行する必要があります (私の専門分野ではありません)。

于 2012-05-03T18:53:40.620 に答える
-1

これは遅いかもしれませんが、コピーする前にファイルを削除すると、次のように置き換えられます。

tell application "System Events"
    if exists file ("NewFilePath") then
        delete file ("NewFilePath")
            -- NewFilePath Is where the file will end up or already is
    end if
end tell
tell application "Finder"
    try
        copy file POSIX file "FilePath" to folder POSIX file "FolderPath"
        -- FilePath is where it is now
        -- FolderPath is the path of the folder you want the file in
    on error errmesg number errn
        display dialog "Error thrown: " & errmesg
    end try
end tell

また、replace か stop finder のどちらかを選択することはできないため、このようなウィンドウは表示されません。

于 2014-03-03T23:33:26.800 に答える