3

AppleScriptObjC をラッパーとして使用して、3 つまたは 4 つの bash シェル スクリプトを自動化しようとしています。これにより、データ ファイルなどを選択するための使いやすい GUI フロント エンドと、いくつかの bash スクリプトを操作および処理するための便利なテキスト ファイルが提供されます。

すべてが機能します (ボタンを押してシェル スクリプトを実行できます) が、セミポータブルにする方法がわかりません。ユーザーに公開するのではなく、必要なスクリプト ファイルを何らかの方法でアプリに組み込んだり生成したりして、他のユーザーに配布できる単一のアプリまたはパッケージを用意したいと考えています。

私は Xcode と AppleScriptObjC (ASOC) の初心者であり、これを行う方法がわかりません。- 単純な do シェル スクリプト コマンドのセットとして、またはターミナル ウィンドウに送信されるコマンドを介してスクリプトを実行できますが、これは、個々のシェル ファイルをすべて配布し、適切な場所に配置する必要があることを意味します。- ASOC 内からスクリプト ファイルを生成しようとしましたが、ASOC が文字列と特殊文字を処理する方法が原因で、ファイルを作成するための障壁に遭遇しました。通常の文字列または引用符で囲まれた形式の文字列構築の両方を試しました。背景として、Apple Technical Note TN2065が関連しています。そのようにファイルを作成すると、特殊文字が失われます。このコードは問題を示しています (たとえば、私が間違っていること!):

set scriptName to "/Users/me/Desktop/myScript.sh" -- Name of file
-- Define a multi line string:
set scriptContents to "       First Line - OK  
Second Line, all good so far
$Test fails - the (dollar sign)Test vanishes
\"$Test\" also fails
Last line"
do shell script ("cd " & myFolder & "; echo \" " & scriptContents & " \" > " & scriptName)

ASOC 内から必要なシェル スクリプトを作成したり、サポート ファイルとしてアプリケーション バンドルに含まれている場合はスクリプトにアクセスしたりする方法がないため、bash から AppleScriptObjC への多くのトリッキーな移植を行うことになります。

1.制御文字などを含むAppleScriptObjCを使用して任意の複数行のファイルを作成するにはどうすればよいですか? 2.または3.必要に応じてASOCが実行できるようにシェルスクリプトをパッケージ化するにはどうすればよいですか?

4

3 に答える 3

0

これには、次の事実が考慮されます。

firstScript = scriptNumberOne.sh というスクリプトを指す変数名
scriptNumberOne.sh = 実行するためにアプリケーションに埋め込んだスクリプトButtonHandlerRunScript_ = Xcode で受信したアクションの名前
pathToResources =私の内部 Resources フォルダーを指す変数現在の場所に関係なく、アプリケーション

この情報を使用して、以下はAppDelegate.applescript私の AppleScriptObjC Xcode プロジェクトのバニラのコピーです。

script AppDelegate
property parent : class "NSObject"
property pathToResources : "NSString"

on applicationWillFinishLaunching_(aNotification)
    set pathToResources to (current application's class "NSBundle"'s mainBundle()'s resourcePath()) as string
end applicationWillFinishLaunching_

on ButtonHandlerRunScript_(sender)
    set firstScript to pathToResources & "/scriptNumberOne.sh"
    do shell script firstScript
end ButtonHandlerRunScript_

on applicationShouldTerminate_(sender)
    -- Insert code here to do any housekeeping before your application quits 
    return current application's NSTerminateNow
end applicationShouldTerminate_

end script
于 2013-11-04T13:23:17.603 に答える
0

シェル スクリプトの場合は異なるかもしれませんが、perl スクリプトの場合は、はるかに少ない手順でこれを行うことができます。

XCode 6で次のようにしました(5でも同じです):

  1. スクリプト ファイルを追加します: [ファイル] > [ファイルを[your-project-name] に追加]

  2. 次の方法で、必要な場所でファイルを参照します。

    (path to resource "myAwesomeScript.pl")

それでおしまい!

ご想像のとおり、これは Finder スタイルのパスを返します。したがって、もちろん、通常の「POSIX パスの引用形式」のアクロバットを実行して、UNIX パスを取得し、引用符とスペースをエスケープする必要がありますが、それはすべて次のとおりです。いつもの..

参考までに、これが私が最終的に得た実際のハンドラーです。罪のない人を保護するために、関数とスクリプトの名前のみを変更しました ;)

on doCoolStuffWithLogsFrom(theThingName)
    set theLogsFolder to POSIX path of ((path to home folder as string) & "Library:Logs:Something:Something:" & theThingName)
    tell me to log "Processing logs in: " & theLogsFolder
    do shell script "/usr/bin/perl " & (quoted form of POSIX path of (path to resource "doCoolStuffWithLogs.pl")) & " " & quoted form of theLogsFolder

end doCoolStuffWithLogsFrom

私を捕まえたいくつかの小さなこと:

  • .pl とスクリプト パラメータの間にスペースを追加することを忘れないでください ( & " " &)

  • 最後の「引用形式」は、コンソールのログ行がエスケープされていない UNIX パスを出力する場所です。読みやすさのために、私の好みです。別の方法を好むかもしれません。つまり、'set theLogsFolder' 行に引用符付きの形式を入れて、ログ出力を端末コマンドに簡単にコピー/貼り付けできるようにします。

于 2014-08-05T20:21:08.500 に答える