このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

make new folder atの記述で判らない事

発言者:yabuki
( Date Thursday, April 05, 2001 19:10:09 )


いつもお世話になります。

applescriptの記述でフォルダを作成する場合に
make new folder at パス
という記述を使っています。

フォルダの保存先を指定して(フォルダ名も)
その中にいくつかのフォルダを作成するscriptを作成しました。
保存先をデスクトップにすると問題なく処理しますが、
違う所(例えばシステムフォルダや初期設定フォルダなど)にすると
エラーになってしまいます。

scriptの記述は(省略型です)

tell application "Finder"
    set SaveFolder to (choose folder with prompt"保存先を指定")
  end tell

tell application "Finder"
    activate
    make new folder at SaveFolder with properties {name:Newfolder}
    ---フォルダを作成するためのフォルダを作成
    set SaveFolder_path to folder Newfolder 
    ---これのフルパス
 ---(folder Newfolderでエラーする場合は SaveFolder & Newfolderで問題なくなる)
end tell

repeat inputTEXT1 times ---フォルダ数の数だけ繰り返す。
    tell application "Finder"
      activate
      make new folder at SaveFolder_path ---フォルダ作成
      ---上記の記述で保存先がデスクトップ以外だとエラーになります。
      select folder "名称未設定フォルダ" of SaveFolder_path
      set name of selection to Newfolder & "_P" & inputTEXT1 as string 
      ---フォルダに名前を付ける。
    end tell
  end repeat

make new folder at パス の
パスの記述が●●●:×××:▲▲▲:という型のものではなくて
エラーしていると思えるのですが。
理由は(記録を使って記述させた場合に)
make new folder at folder "初期設定" of folder "システムフォルダ" of startup disk
や
make new folder at disk "data"
のような記述になっているからです。

フォルダ内にフォルダを作成するscriptを作るにはどのような記述が良いのでしょうか?
ご教授下さい。(OSは8.1でAppleScriptは1.1.2です)

田中求之 さんからのコメント
( Friday, April 06, 2001 13:33:34 )

スクリプトを省略して書かれているために、かえってどのような処理をな
さりたいのか分かりにくくなっているのですが、

1:最初に選択したフォルダーの中に、新しいフォルダーを作る
2:上の処理で出来た新しいフォルダーの中に、複数の新しいフォルダー
  を作成する(名前は通し番号?)

という処理でよろしいのでしょうか? それでしたら、以下のスクリプトを
お試しください。

set Newfolder to "TestFldr"

set SaveFolder to (choose folder with prompt "保存先を指定")

tell application "Finder"
  set myNewFldr to make new folder at SaveFolder with properties {name:Newfolder}
  
  repeat with x from 1 to 5
    
    set aFldr to make new folder at myNewFldr
    set name of aFldr to "P_" & (x as string)
    
  end repeat
  
end tell

選んだフォルダーの中に TestFldr という名前のフォルダーを作り、その中に
P_1 から P_5 までの5つのフォルダーが作られます。


処理のポイントは、make new folder の返り値が新しいフォルダーを指す
リファレンスになっていますので、それをそのまま使うということです。
(下手にフルパスに変換したりしないほうがよい)

yabuki さんからのコメント
( Wednesday, April 11, 2001 18:03:38 )

いつもレスが遅くなって申し訳ありません。

>1:最初に選択したフォルダーの中に、新しいフォルダーを作る
>2:上の処理で出来た新しいフォルダーの中に、複数の新しいフォルダー
>  を作成する(名前は通し番号?)

そのようなscriptです。
田中さんのサンプルを用いて自分のscriptがうまく作動しました。
ありがとうございます。

ポイントとしては田中さんのサンプルはフォルダを作ってから
そのままrepeat文で繰り返しフォルダを作成しているところだと
自分で勝手に解釈しております。

田中さんのは
tell application "Finder"
フォルダを作る処理
そのまま繰り返し文で5つのフォルダを作る
end tell

私のは
tell application "Finder"
フォルダを作る処理
とりあえずフルパスを得る
end tell
repeat ●● times
tell application "Finder"
得たフルパスにフォルダ作成---ここでエラーになる
フォルダ名を付ける
end tell
end repeat

私の記述が悪いというのは良く判りますが、
make new folder at フルパス という記述で
エラーになったり、ならなかったりするのでしょうか。
(デスクトップではOK、違うボリュームやディレクトリではNGです)
できれば、今後の参考までに教えて下さい。

田中求之 さんからのコメント
( Wednesday, April 11, 2001 18:08:52 )

tell application "Finder"
  make new folder at folder "Macintosh HD:書類:"
end tell

というように、フルパスの前に Folder という指示をきちんとつけると
フルパスで指定したフォルダーの中にちゃんと新しいフォルダーが作られ
ますよ?

うまくいきませんか?

yabuki さんからのコメント
( Thursday, April 12, 2001 16:56:08 )

>tell application "Finder"
>  make new folder at folder "Macintosh HD:書類:"
>end tell
>
>というように、フルパスの前に Folder という指示をきちんとつけると
>フルパスで指定したフォルダーの中にちゃんと新しいフォルダーが作られ
>ますよ?
>
>うまくいきませんか?

残念ならがうまくいきませんでした。
長いscriptなのですが、下記に記述しておきます。
↓ここから

with timeout of 3600 seconds
  ---timeout を3600秒に設定
  tell application "Finder"
    set SaveFolder to ツ
      (choose folder with prompt "フォルダの保存場所を選択してください。")
    ---保存先のフルパスを変数にする
  end tell
  
  tell application "Finder"
    select file ((path to me) as string)
  end tell
  repeat
    set inputTEXT0 to (display dialog "作成したいフォルダ名を入力して下さい。" & return & ツ
      "ただし、フォルダ名は26バイト以内が限界です。" & return & ツ
      "また、保存先に同じ名前のフォルダが存在する場合" & return & ツ
      "エラーを起こします。" default answer "" buttons {"OK", "キャンセル"} ツ
      default button 1)
    set GainText to text returned of inputTEXT0
    set ButtonRes to button returned of inputTEXT0
    if ButtonRes = "OK" then
      set ByteNum to GetByte(GainText)
      ---ダイアログのレスがOKの時、入力した文字列のバイト数を求める
    end if
    try
      set ByteNum to ByteNum as integer
      if (ByteNum > 0 and ByteNum < 27) then
        ---ファイル名のバイト数の制限
        set ByteNum to ByteNum as integer
        exit repeat
      else
        display dialog "もう一度入力して下さい。"
        ---制限値以外の場合のコメント。やり直し。
      end if
    on error
      display dialog "もう一度入力して下さい。"
      ---制限値以外の場合のコメント。やり直し。
    end try
  end repeat
  
  repeat
    set inputTEXT1 to text returned of (display dialog "最初のページ数を入力して下さい。" & return & ツ
      "ただし、フォルダ名の関係上、900が限界です。" default answer "" buttons {"OK", "キャンセル"} ツ
      default button 1)
    try
      set inputTEXT1 to inputTEXT1 as integer
      if (inputTEXT1 > 0 and inputTEXT1 < 901) then
        ---始まりのページ数の制限
        set inputTEXT1 to inputTEXT1 as integer
        exit repeat
      else
        display dialog "もう一度入力して下さい。"
        ---数字でなかったり、制限値以外の場合のコメント。やり直し。
      end if
    on error
      display dialog "もう一度入力して下さい。"
      ---数字でなかったり、制限値以外の場合のコメント。やり直し。
    end try
  end repeat
  
  repeat
    set inputTEXT2 to text returned of (display dialog "作成したいフォルダ数を整数(1〜100)で入力して下さい。" default answer "" buttons {"OK", "キャンセル"} ツ
      default button 1)
    try
      set inputTEXT2 to inputTEXT2 as integer
      if (inputTEXT2 > 0 and inputTEXT2 < 101) then
        ---フォルダ数最大100個の制限
        set inputTEXT2 to inputTEXT2 as integer
        exit repeat
      else
        display dialog "もう一度入力して下さい。"
        ---数字でなかったり、制限値以外の場合のコメント。やり直し。
      end if
    on error
      display dialog "もう一度入力して下さい。"
      ---数字でなかったり、制限値以外の場合のコメント。やり直し。
    end try
  end repeat
  
  tell application "Finder"
    activate
    make new folder at SaveFolder with properties {name:GainText}
    ---フォルダを作成するためのフォルダを作成
    set SaveFolder_path to folder GainText
    ---これのフルパス
  end tell
  
  repeat inputTEXT2 times
    ---フォルダ数の数だけ繰り返す。
    tell application "Finder"
      activate
      make new folder at SaveFolder_path
      ---フォルダ作成
      select folder "名称未設定フォルダ" of SaveFolder_path
      set name of selection to GainText & "_P" & inputTEXT1 as string
      ---フォルダに名前を付ける。
    end tell
    set inputTEXT1 to (inputTEXT1 + 1)
    ---何回目かをカウント
  end repeat
end timeout

on GetByte(GainText)
  set MyPath to (path to me)
  open for access MyPath with write permission
  set eof MyPath to 0
  write GainText to MyPath starting at 1
  set ByteNum to (get eof MyPath)
  set eof MyPath to 0
  close access MyPath
  return ByteNum
end GetByte

↑ここまでです
デスクトップではうまく作動しますが、
その他のディレクトリではエラーになります。

田中求之 さんからのコメント
( Thursday, April 12, 2001 17:11:15 )

ざっと見てみましたが、まず以下の部分に致命的なミスがあります。

tell application "Finder"
  activate
  make new folder at SaveFolder with properties {name:GainText}
  ---フォルダを作成するためのフォルダを作成
  set SaveFolder_path to folder GainText
  ---これのフルパス
end tell

このスクリプトの

>set SaveFolder_path to folder GainText

がエラーになります。なぜなら、GainText は、フォルダーの名前であって
フォルダーのフルパスではないからです。この部分のエラーを消すには、

>set SaveFolder_path to folder ((SaveFolder as string) & GainText)

と書き換えます。これで動くと思いますよ(手元では動きました)。

なお、入力された文字列のバイト数を求めるのにファイルの読み書きによる
方法を使われているようですが、スクリプト自身のデータフォークを読み書き
するのは、あまり良いとは思えません(動くんだろうとは思いますが)。

もし osax を使うのが嫌でなければ Tanaka's osax 2.0 を入れてもらえば、

on GetByte(GainText)
  return MT Byte Length GainText
end GetByte

と書き換えられますよ(私の手元のテストは、このハンドラーで行いました)。

yabuki さんからのコメント
( Thursday, April 12, 2001 18:56:35 )

ありがとうございます。無事に動作しました。

>>set SaveFolder_path to folder GainText
>
>がエラーになります。なぜなら、GainText は、フォルダーの名前であって
>フォルダーのフルパスではないからです。この部分のエラーを消すには、
>
>>set SaveFolder_path to folder ((SaveFolder as string) & GainText)

すいません。
上記の事は気づいていたのですが、古い記述を書いてしまいました。
しかし、古い記述を載せたおかげで、
記述の間違いを教えて頂ける事になりました。(怪我の功名です)

set SaveFolder_path to folder GainText でエラーをするので
set SaveFolder_path to SaveFolder & GainText に直してみて
うまくいかないと悩んでいました。(恥)
これからはフルパスを得る場合は頭にfolder(またはfile)を記述するようにします。



> もし osax を使うのが嫌でなければ Tanaka's osax 2.0 を入れてもらえば、
>
> on GetByte(GainText)
>  return MT Byte Length GainText
> end GetByte
>
> と書き換えられますよ(私の手元のテストは、このハンドラーで行いました)。

知らないだけでした。(汗)
今後、教えて頂いた記述を使わせてもらいます。