2011-07-29 5 views
7

更新: のAppleScript:何かがディレクトリやファイルがあるかどうかを確認する方法


以下
ソリューションを使用すると、Finderから選択した項目のリストを持っていると言います。いくつかのファイル、フォルダ、様々なバンドル、そして選択に含まれるいくつかのアプリケーションがあるとします。

ここでは、(UNIX用語で)ディレクトリのアイテムのみが、であるとします。私。あなたは、端末内のcdにできるアイテムしか必要ではありません。

あなたは

を各項目のkindプロパティをチェックし、それが「フォルダ」に等しいかどうかを確認し、彼らは実際にはあるけれども、それは、アプリケーションバンドルまたは他のバンドル/パッケージのために動作しません「フォルダ」(ディレクトリ)することができますアイテムが実際のファイルオブジェクト(エイリアスではない)である場合、各アイテムのclassプロパティをチェックすることができます。バンドルは現在「ドキュメントファイル」インスタンスであり、アプリケーションは「アプリケーションファイル」インスタンスです。

classプロパティをチェックすることができないため、実際のファイルオブジェクトではなくエイリアスのリストしかないと悪化します。それは常に「エイリアス」とだけ言います。

私が考えることができる唯一の解決策は、各項目のPOSIXパスを取得して、スラッシュが末尾にあるかどうかを確認するか、別の言語で書かれたスクリプトにそのパスを送信するか何かがディレクトリかどうか。

どちらのアイデアも私にとって狂っているようです。末尾のスラッシュを確認するのは非常にハッキーで壊れやすく、すべてのスクリプトを別のスクリプトに渡すことは過度の過労です。


更新:何Asmusは以下示唆AppleScriptのは、独自のにそれを把握するための方法はありませんようだと、良い解決策 のみ ように見えるん:

do shell script "file -b " & filePosixPath 

これは、フォルダ、バンドル、アプリケーション、パッケージなどの文字列 "directory"を返すでしょう。
ディスクについては、 "スティッキディレクトリ"を返します。

は、簡単なAppleScriptの解決策がありますかなりよく

on isDirectory(someItem) -- someItem is a file reference 
    set filePosixPath to quoted form of (POSIX path of (someItem as alias)) 
    set fileType to (do shell script "file -b " & filePosixPath) 
    if fileType ends with "directory" then return true 
    return false 
end isDirectory 
+2

まあ、I'dが最も簡単な解決策があると言いますPOSIXパスをコマンドラインツール 'file'に渡します。 'file -b/Applications/Safari.app'は単に" directory "を返します。 'do shell script'ループにそれを組み込むのは簡単であるはずです。 – Asmus

+0

@Asmus:あなたはおそらく正しいでしょう。私が質問を書いた後、私はフル・シェル・スクリプトではなく、簡単なシェル・コマンドを実行できることに気付きました。それでも、何かがディレクトリであるかどうかといった基本的なことを理解するために、AppleScriptの外に出なければならないのは奇妙なことです。私は1日かそこらの質問を残しておきますし、その間にあなたは答えとしてコメントを書くことができますので、あなたはポイントを得ることができます:) – Flambino

+0

@Flambino私はあなたの良い質問をupvoteできません。投票する! :( – fireshadow52

答えて

6

働く一般化機能です。システムイベントを使用して何かが「パッケージ」であるかどうかを確認することができます。

tell application "Finder" to set theItems to (selection) as alias list 

set canCDItems to {} 
tell application "System Events" 
    repeat with anItem in theItems 
     if anItem is package folder or kind of anItem is "Folder" or kind of anItem is "Volume" then 
      set end of canCDItems to contents of anItem 
     end if 
    end repeat 
end tell 
return canCDItems 
+0

面白い!その語彙はFinderではなくSystem Eventsに埋め込まれていますが、少なくともそれは存在します。私はAsmusのソリューションを使用して終了しましたが、元の質問に答えたので、帽子の先端(とチェックマーク)をあなたに。ありがとう! – Flambino

+2

こんにちは。システムイベントは、Finderから負荷を取り除くために作成されました。基本的にFinderはコンピュータ関連の作業に忙しいことが多いので、できる限りFinderの代わりにシステムイベントに依頼するのが最善の方法です。そのようなシステムイベントは、Finderが行うことができ、時にはさらに多くのことを行うことができます。 Finderを使用してシステムイベントが代わりに行うことができるかどうかを確認することを考えているときはいつでもお勧めします。 – regulus6633

+0

背景情報をありがとう。私はそれがシステムイベントの起源であるかどうかはわかりませんでしたが、多くの意味があります。私は今システムイベントの辞書を詳しく見ていきます。とても感謝しております! – Flambino

0

私はマウンテンライオンのためのファインダーへのdiffツールのカップルをプラグインしようとすると、選択した項目は、フォルダやファイルだったかどうかを確認したかったように私は、今日、これを必要としていました。これが私の仕事:

tell application "Finder" 
    set sel1 to the selection 
    set class1 to class of (item 1 of sel1) 
    set cs to (class1 as string) 
    ... 
    if cs = "folder" or cs contains "class cfol" then 
    set choice to display alert "Which tool?" buttons {"opendiff", "diffmerge"} 
    set tool to (button returned of choice) 

は、私は私がアップルスクリプトエディタでまたはFinder上で、ツールバーのボタンをクリックした結果として実行されていたかどうかに応じて、両方のケースのためにCSをテストするために必要ない。ファーneatestからではなく、以前のAppleScriptのみのソリューションよりも短く、これは私の代替案となり、すべての状況で完全なテストの

on isDirectory(someItem) 
    ((class of someItem) as string) contains "fol" 
end isDirectory 

結果を歓迎します!

1

変数は単なる文字列である場合は、このフォームを使用します。

on isDirectory(someItem) -- someItem is a string 
    set filePosixPath to quoted form of (POSIX path of someItem) 
    set fileType to (do shell script "file -b " & filePosixPath) 
    if fileType ends with "directory" then return true 
    return false 
end isDirectory 
0

標準機能追加は、(必要なしシステムイベントを)これを提供しています:

set isBundleType to package folder of (info for (choose file)) 
関連する問題