3

これは機能します (たとえば、「3 つの引数」が出力されます)。

to run argv
    do shell script "echo " & (count argv) & " arguments"
end run

これはそうではありません (「Argument 3: three」のみを出力し、前の 2 つの引数は出力しません):

to run argv
    do shell script "echo " & (count argv) & " arguments"

    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'"
    end repeat
end run

どちらの場合も、osascriptMac OS X 10.5.5 を使用してスクリプトを実行しています。呼び出しの例:

osascript 'Script that takes arguments.applescript' Test argument three

出力をリダイレクトしていないので、スクリプトがエラーをスローしていないことがわかります。

display dialogの上にステートメントを追加するdo shell scriptと、「ユーザーの操作は許可されていません」というエラーがスローされるため、ループ本体を実行していることがわかります。

私は何を間違っていますか?このループで osascript が何も出力しない原因は何ですか?

4

2 に答える 2

2

一時ファイルを使用する必要がないように、これを試してください。

to run argv
        set accumulator to do shell script "echo " & (count argv) & " arguments" altering line endings false
        repeat with i from 1 to (count argv)
                set ln to do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'" altering line endings false
                set accumulator to accumulator & ln
        end repeat
        return accumulator
end run
于 2008-11-08T08:58:28.607 に答える
0

あなたの問題は、ループや argv の使用とは無関係のようです。これは、最後のテストのみがdo shell script実際に結果を返す、より単純なテスト ケースです。

do shell script "echo foo"
delay 2
do shell script "echo bar"

さらに、次のわずかな変更により、期待される結果が得られます。

to run argv
    do shell script "echo " & (count argv) & " arguments > /test.txt"
    
    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /test.txt"
    end repeat
end run

test.txt次のような 4 行が含まれます。

3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz

この回避策は失敗します。

to run argv
    do shell script "echo " & (count argv) & " arguments > /tmp/foo.txt"
    
    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /tmp/foo.txt"
    end repeat
    
    do shell script "cat /tmp/foo.txt"
    do shell script "rm /tmp/foo.txt"
end run

現在でも、最後の行だけが返されます。これは、 TN2065の次の質問に関連している可能性があります。

Q: 私のスクリプトは長時間にわたって出力を生成します。入ってくる結果をどのように読み取るのですか?

A: 繰り返しますが、簡単に言えば、そうではありません。do shell script は、コマンドが完了するまで戻りません。Unix 用語では、パイプの作成には使用できません。ただし、できることは、コマンドをバックグラウンドに置き (次の質問を参照)、その出力をファイルに送信し、ファイルがいっぱいになったときにファイルを読み取ることです。

残念ながら、AppleScript 自体に複数の行を読み取らせる方法を知るには、AppleScript-fu が十分ではありません。

于 2008-11-08T08:35:06.050 に答える