スクリプトを改善するために最初にできることは、シェル スクリプトを使用しないことです。シェル スクリプトは削岩機のようなものですが、実行していることは非常に小さなハンドヘルド ハンマーだけで済みます。
元のスクリプトは次のとおりです。
tell application "Finder"
activate
set jobNum to text returned of (display dialog "Enter a job number:" default answer "[JobNumber]-[Description]")
set folderpath to POSIX path of (choose folder with prompt "Select client folder")
do shell script "/bin/mkdir -p " & quoted form of folderpath & "/" & quoted form of (jobNum) & "/" & quoted form of (jobNum & "-Links")
do shell script "/bin/mkdir -p " & quoted form of folderpath & "/" & quoted form of (jobNum) & "/" & quoted form of (jobNum & "-PDFs")
do shell script "/bin/mkdir -p " & quoted form of folderpath & "/" & quoted form of (jobNum) & "/" & quoted form of (jobNum & "-Supplied")
do shell script "/bin/mkdir -p " & quoted form of folderpath & "/" & quoted form of (jobNum) & "/" & quoted form of (jobNum & "-Versions")
end tell
読み取り、書き込み、および保守が容易な「de-shelled」バージョンと比較してください。
tell application "Finder"
activate
set jobNum to text returned of (display dialog "Enter a job number:" default answer "[JobNumber]-[Description]")
set theClientFolder to (choose folder with prompt "Select client folder")
set theSubFolderNames to {"Links", "PDFs", "Supplied", "Versions"}
repeat with theSubFolderName in theSubFolderNames
make new folder at theClientFolder with properties {name:jobNum & "-" & theSubFolderName}
end repeat
end tell
変数「folderpath」が「theClientFolder」に変更されていることに注意してください。choose folder はパスを返さず、選択したフォルダーのエイリアス オブジェクトを返すためです。Finder に新しいフォルダーを作成させるコマンドは、「[フォルダーを作成するエイリアス] に新しいフォルダーを作成する」なので、エイリアスをパスに変換してその中に新しいフォルダーを作成する必要はありません。
また、フォルダーの名前がリスト内の変数として宣言されていることにも注意してください。これにより、後で読みやすく、または変更しやすくなります。AppleScript を知らない人でも、このスクリプトを開いて、「PDFs」フォルダの名前を「Documents」などに変更できます。
私が提案できるもう 1 つの改善点は、ユーザーからの入力をもう少し洗練された方法で収集することです。クライアント フォルダ以外の 2 つの情報 (ジョブ番号とジョブの説明) を要求しているように見えるので、2 つのダイアログ ボックスを使用してください。入力してもらいます。これらのダイアログの外観をいくつかの方法で改善することもできます。また、エラー処理を少し追加することもできます。表示しているダイアログをユーザーがキャンセルすると、エラーが生成されます。ユーザーが「OK」をクリックしたかどうかを確認することで、それらを適切に処理できます。
ユーザー入力が少しクリーンアップされたバージョンのスクリプトを次に示します。
tell application "Finder"
activate
display dialog "Enter a job number:" default answer "100" buttons {"Cancel", "OK"} default button "OK" with title (the name as text) with icon note giving up after 180
if the button returned of the result is equal to "OK" then
set theJobNumber to the text returned of the result
display dialog "Enter a job description:" default answer "Photos" buttons {"Cancel", "OK"} default button "OK" with title (the name as text) with icon note giving up after 180
if the button returned of the result is equal to "OK" then
set theJobDescription to the text returned of the result
try
choose folder with prompt "Select client folder:" default location (the path to the desktop folder as alias) without multiple selections allowed, invisibles and showing package contents
set theClientFolder to the result
on error
set theClientFolder to ""
end try
if theClientFolder is not equal to "" then
set theSubFolderNames to {"Links", "PDFs", "Supplied", "Versions"}
repeat with theSubFolderName in theSubFolderNames
make new folder at theClientFolder with properties {name:theJobNumber & "-" & theJobDescription & "-" & theSubFolderName}
end repeat
end if
end if
end if
end tell
これにより、上部に「Finder」と表示され、Finder アイコンを含むダイアログ ボックスが表示されます。Finder アイコンは、180 秒後に (タイムアウト エラーを防ぐため) 放棄され、ユーザーが任意の時点で「キャンセル」を押すと、エラーを生成せずに正常に終了します。入力ダイアログのデフォルトの回答を微調整して、ユーザーが正しい入力を行えるようにすることができます。たとえば、ジョブ番号が 4 桁の場合は、ここに 4 桁の数字を入力します。また、フォルダーの選択プロンプトがデスクトップを表示して開始されます。すべてのクライアント フォルダーを格納するディスクまたはフォルダーがある場合は、デスクトップを別の場所に変更できます。
choose folder with prompt "Select client folder:" default location (disk "Clients" as alias) …
明確に言うと、シェル スクリプトはすばらしいものですが、PHP 関数や Perl regex などの UNIX 層の固有の機能を取得するには、「do shell script」のみを使用することをお勧めします。Mac レイヤーで既に利用できるものはすべて、AppleScript でより簡単かつ安全に使用でき、読み取り、書き込み、および保守が容易になります。特に、フォルダの作成など、本当に基本的なこと。