FileMakerでフィールドに入力したパスをもとにフォルダを作成するスクリプト

あるフィールドに入力されたフォルダパスをもとにして、そのフォルダを作成するというスクリプトです。
さらに、フォルダが作成されたタイミングを取得してメッセージを表示してみます。

※ FileMaker Pro 17 Advanced では複数のスクリプトステップに「ディレクトリの作成」というオプションが付いていますので、そちらを利用した方が簡単です。


目次

  1. フォルダ作成スクリプト
  2. 「Eventを送信」でフォルダを作成する
  3. 作成されたタイミングを取得する
  4. コマンドプロンプト使用版

1. フォルダ作成スクリプト

あらかじめ「ホーム::g_入力パス」というフィールドを用意し、作成したいフォルダパスを絶対パスで入力しておきます。
パスの区切りは「/」でも「\」でも大丈夫です。

このスクリプトを実行すると、「g_入力パス」のフォルダが作成され、作成が完了した時点でメッセージを表示します。

以下、内容を説明していきます。


2. 「Eventを送信」でフォルダを作成する

最初の「Eventを送信」では以下の計算式を指定します。

"PowerShell New-Item '" & ホーム::g_入力パス & "' -ItemType Directory"

PowerShell を使って「New-Item ‘フォルダパス’ -ItemType Directory」とすることで、フォルダを作成できます。
パスを囲うときは「”」でなく「’」を使います。

ただ単にフォルダを作成する指示を出したい、ということであればこの1行で終わりです。
フィールドの部分は、変数で指定してもOKです。


3. 作成されたタイミングを取得する

フォルダの作成は一瞬で行われますが、直後にファイルを書き出すときなどに、確実にフォルダが作成されたタイミングを取得したいことがあります。

そこで、フォルダが作成されたことを「FileMakerでファイルやフォルダの存在を確認するスクリプト」の方法で確認していきます。

PowerShell によってフォルダが作成されたことを戻り値として取得するのは難しいので、FileMaker側から Loop を使って確認するようにします。

まずは、フォルダ確認用の変数を設定します。

  • $確認用パス
    “file:/” & ホーム::g_入力パス & “/Check.tmp”
  • $テンポラリ
    Get ( テンポラリパス ) & “Error.tmp”

ここから先がループ処理です。もう一度その部分だけ表示します。

変数「$i」をカウンターとして利用しています。

ループに入ったら「スクリプト一時停止/続行」で0.01秒のウェイトを入れます。ここは0秒にしても動作しますが、個人的に0秒ループが好きではないので、数値を入れるようにしています。

そして「フィールド内容のエクスポート」で空文字の一時ファイルを出力し、「ファイルを挿入」と「Get ( 最終エラー ) = 0」の組み合わせで、フォルダの存在を確認します。

「フィールド内容のエクスポート」は以下のような設定です。

「ファイルを挿入」の設定は以下のようになります。

これで「Get ( 最終エラー ) = 0」ならフォルダが存在していますので、ループを抜けるようにします。

フォルダがまだ作成されていなければ「$i + 1」としてカウンターを加算し、20以上ループが回ってしまうようなら抜けるようにします。

以上でフォルダが作成されたタイミングを掴むことができました。
経験的には、1~2回目のループでフォルダ作成は完了しますので、体感的なラグはほとんどありません。

ループを抜けたあとは、「$i」が20以上のときをエラーと捉えて分岐しておけばOKです。

ループ内で使った一時ファイルは、次のような計算式で削除しています。

  • Error.tmp
    “PowerShell /c Remove-Item ‘” & Replace ( $テンポラリ ; 1 ; 1 ; “” ) & “‘”
  • Check.tmp
    “PowerShell /c Remove-Item ‘” & ホーム::g_入力パス & “/Check.tmp'”

4. コマンドプロンプト使用版

「Eventを送信」の計算式でコマンドプロンプトを使ったスクリプトも載せておきます。
PowerShell のときと違い、パスを「”」で囲っていることと、区切り文字を「/」から「\」に変更している箇所があることが注意点です。

3つある「Eventを送信」の計算式は、順番に以下のようになります。

"cmd /c md "" & ホーム::g_入力パス & """
"cmd /c del "" & Substitute ( Replace ( $テンポラリ ; 1 ; 1 ; "" ) ; "/" ; "\\" ) & """
"cmd /c del "" & Substitute ( ホーム::g_入力パス ; "/" ; "\\" ) & "Check.tmp""

特に「del」コマンドは、パスの区切りが「/」だと動作しません。
コマンドプロンプトではこのようなことがあるので、すべての「/」を「\」に変換してから使うようにした方が間違いが起こりません。

「md」コマンドは区切りが「/」でも動作しますので、ここでは変換しませんでした。

以上で、フォルダを作成するスクリプトについては終わりです。

最近は PowerShell も使えるようになろうと勉強しています。
遅ればせながら、PowerShell Core が macOS 10.12 以降をサポートしていることを知ったためです。
私は macOS を持っていないので今は関係ないものの、いつか役に立つ日がくるかもしれないですし。

それに、なんとなくコマンドプロンプトと似たようなところがあってすんなり入っていけたし、使いやすいです。
FileMakerでは PowerShell を使うようにしようかと思っています。

動作環境: Windows10, FileMaker Pro 16

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

one × 3 =