2017年4月2日日曜日

自作のC#コンソールアプリをMac OS で動かして、FileMakerで使う。

自作のC#コンソールアプリをMac OS で動かして、FileMakerで使う。

C#コンソールアプリをMac OS Xで使用するには、「Mono」が必要です。
Mono for Mac OS X
http://www.mono-project.com/download/#download-mac

VisualStudio 2015 で、コンソールアプリを作成。
引数を受け取って、"Hello World!" と 引数を返す、カンタンなモノ。

using System;
namespace HelloWorld
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World! {0}", args[0]);
}
}
}

対象のフレームワークは、「.Net Framework 4.5」でビルド。
HelloWorld.exe ができました。

Macの /Applications フォルダに入れます。(任意の場所でもかまいません。)
/Applications/HelloWorld.exe

AppleScriptの作成。


do shell script "/Library/Frameworks/Mono.framework/Versions/4.8.0/bin/mono-sgen32 /Applications/HelloWorld.exe こんにちわ!"
結果:
"Hello World! こんにちわ!
が返ってきます。


以下でもイケると思ったのですが、monoコマンドが無いとエラーになります。
do shell script "mono /Applications/HelloWorld.exe こんにちわ!"
以下のようにフルパスが、必要です。
do shell script "/Library/Frameworks/Mono.framework/Versions/4.8.0/bin/mono-sgen32 ...
ちなみに、「mono-sgen64」とすると、64bitで動作するようです。
do shell script "/Library/Frameworks/Mono.framework/Versions/4.8.0/bin/mono-sgen64 ...
※※VisualStudio 2015 で、プラットフォームのターゲット:Any CPUにした場合。

FileMakerに組み込み:

以下のようなAppleScriptになるようにFileMakerのスクリプトを組みます。

set varResult to (do shell script " /Library/Frameworks/Mono.framework/Versions/4.8.0/bin/mono-sgen32 \"/Applications/HelloWorld.exe\" \"こんにちわ!\nこんばんわ。\" ")
 set field "Result" of current record to varResult as text

FileMakerのファイル(例):
ファイル名:AppleScript
テーブル名:AppleScript
フィールド:Target|C#で作ったコンソールアプリのフルパスを設定
フィールド:Argument|引数を設定
フィールド:Result|結果

FileMakerのスクリプト(例):
スクリプト名:Run_AppleScript
フィールドへ移動 []
変数を設定 [$ShellScript; 値:
Let([
Script=
"
/Library/Frameworks/Mono.framework/Versions/4.8.0/bin/mono-sgen32 {Target} {arg}
"
];
Substitute ( Script ;
["`" ; "\""]
; ["{Target}" ; Quote ( AppleScript::Target )]
; ["{arg}" ; Quote ( Substitute ( AppleScript::Argument ; ¶ ; "\n" ) )]
)
)
変数を設定 [$AppleScript; 値:
Let([
Script=
"
set varResult to (do shell script {ShellScript})¶
set field `Result` of current record to varResult as text
"
];
Substitute ( Script ;
["`" ; "\""]
; ["{ShellScript}" ; Quote ( $ShellScript )] )
)
AppleScript を実行 [$AppleScript]

フィールド:Target「/Applications/HelloWorld.exe」
フィールド:Argument「こんにちわ!こんばんわ。」

とにゅうりょくし、スクリプト名:Run_AppleScript を実行。
フィールド:Result に
Hello World! こんにちわ!こんばんわ。
が入ります。


おまけ!
FileMaker補助アプリケーション「ProcessMakerTL(プロセス メーカー ティー エル)」を使った場合、FileMakerのスクリプト「URLから挿入」で同じことができるようになります。ターゲットアプリのパスをWinとMacで切り替えれば、Windowsでも戻り値の取得が出来ます。
ProcessMakerTL(プロセス メーカー ティー エル)
https://sites.google.com/site/processmakertl/



2017年3月30日木曜日

FileMaker PowerShell と連携、戻り値取得。cmdコマンドを実行。プラグイン不要

FileMaker PowerShell と連携、戻り値取得。cmdコマンドを実行。プラグイン不要。
OS:Windows

FileMaker 12以降?

フィールド:Command
値:
$Rsult=cmd /C dir /b "c:\" ;
$return=$Rsult -join "%0A" ;

フィールド:CallBack
値:
Start-Process ('fmp://$/{ファイル名}?script=FireCommand&$Return='+$return);

FileMakerから実行
以下のようにすると送信結果の戻り値の取得が取得出来ます。
スクリプト名:FireCommand
If [ not IsEmpty ( $Return )]
フィールド設定 [PS::Result; $return]
フィールドへ移動 []
現在のスクリプト終了 []
Else If [Get ( スクリプト引数 ) = 1]
変数を設定 [$Script; 値:Quote ( Substitute ( PS::Command & PS::CallBack ; ¶ ; "" ) )]
Event を送信 [「aevt」; 「odoc」; "powershell -windowstyle hidden -Command " & $Script]
End If



※戻り値が多いと全部は、取得できません。
そんなときは、以下を使えば、解決します。
ProcessMakerTL(プロセス メーカー ティー エル)
FileMaker補助アプリケーション

FileMaker PowerShell と連携、戻り値取得。dirコマンドっぽく使う。プラグイン不要


FileMaker PowerShell と連携、戻り値取得。dirコマンドっぽく使う。プラグイン不要。
OS:Windows

FileMaker 12以降?

フィールド:Command
値:
$Rsult=Get-ChildItem "C:\" | Select-Object Fullname;
$return=$Rsult.FullName -join "%0A" ;

フィールド:CallBack
値:
Start-Process ('fmp://$/{ファイル名}?script=FireCommand&$Return='+$return);

FileMakerから実行
以下のようにすると送信結果の戻り値の取得が取得出来ます。
スクリプト名:FireCommand
If [ not IsEmpty ( $Return )]
フィールド設定 [PS::Result; $return]
フィールドへ移動 []
現在のスクリプト終了 []
Else If [Get ( スクリプト引数 ) = 1]
変数を設定 [$Script; 値:Quote ( Substitute ( PS::Command & PS::CallBack ; ¶ ; "" ) )]
Event を送信 [「aevt」; 「odoc」; "powershell -windowstyle hidden -Command " & $Script]
End If