みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
EVENTを送信でコマンド送信をしたいです。
cmd.exe は起動するのですが、その後ろの部分がcmd側に送信されずお知恵を拝借したいです。
【詳細】
スクリプトには、
EVENTを送信 [[aevt];[odoc];「cmd echo HELLO」
と書いてテストしています。
このようにしてスクリプトを実行するとcmd.exeが起動してそのまま待機しているような状態です。
ググってみたりしたのですが、同じ現象が見つからずこちらで質問させてもらいました。
よろしくお願いします。
OS:[ Win7 64Bit ]FileMaker Ver:[ Filemaker Pro 15 ]
コマンドプロンプトを残したいなら、
cmd /k echo HELLO
コマンドプロンプトを閉じる場合は、
cmd /c echo HELLO
Offline
qb_dp様
説明不足で恐縮なのですが、ホントはWindows内のドキュメントのフルパスを取得したいスクリプトをつくりたいのですがそれができずなのです。
cmdが起動するのみで、コマンド自体が送信されないところが問題となっております。
Windows内のドキュメントのフルパスなら コマンドをつかわなくても
FileMakerの関数
Get ( ドキュメントパス )
で取得出来ます。
参考:
「Event を送信」は、投げっぱなしのスクリプトなので、それだけでは、戻り値は取得できません。
「Event を送信」でコマンドを実行し、戻り値を取得する場合は、少々面倒な処理が必要です。
下記が参考になります。
https://fm-aid.com/bbs2/viewtopic.php?pid=31284#p31284
Offline
qb_dp様
回答いただきありがとうございます。
重ね重ねの説明不足で大変恐縮なのですが、
正確にはドキュメントフォルダ内に格納しているファイルのフルパスを取得し、それを印刷するというのが今作っているスクリプトの全容になります。
というのも、普段の業務では例えばロット番号「123ABC」という呼び名でやりとりしている部品の検査成績書をPDFで保管し、完成品出荷時に使った部品の成績書も印刷し添付するという業務があります。
工程内と各工程間では「123ABC」と記入し伝達するのですが、書類は正確には「123ABC_(タイムスタンプ).pdf」という名前で保存されており、印刷するには前工程から回ってくる「123ABC」という文字列を見て人間が「123ABC_(タイムスタンプ).pdf」を印刷するという作業を自動化したい案件です。
したがって、Filemakerでは、例えば[::部品01](フィールド)にテキストとして「123ABC」が記入されているので、cmd.exeで該当するディレクトリにおいて
dir /a-d 16-123ABC*|clip
というコマンドを実行し、フルパスを取得したいと考えました。
それを[::部品01フルパス](フィールド)に貼り付けすることで[::部品01フルパス](フィールド)すなわち「C:\...\...\123ABC_(タイムスタンプ).pdf」の印刷を行いたいとおもっております。
そのために、スクリプトでは
変数を設定 [$SSS, 値:"cmd /c dir /a-d" & ::部品01 & "*|clip"]
EVENTを送信 [[aevt];[odoc];$SSS] #cmd
貼り付け [選択; スタイルなし; ::部品01]
変数を設定 [$PPP, 値:::部品01フルパス]
EVENTを送信 [[aevt];[pdoc];$PPP] #印刷
・
・
・
としたいところ、うまくいかず。
EVENTを送信 [[aevt];[odoc];「cmd echo HELLO」
でcmd側の標準出力に「HELLO」と出るかテストを行ったところ、cmdは立ち上がるもののecho HELLO が送信されていない現象になっております。
『EVENTを送信』のスクリプトのスペースの取り方などが良くないか?
Windowsのcmd.exeの設定などがうまくないのか?
などのネタがありましたら、ご教示いただけますと幸いです。
訂正
間違い
dir /a-d 16-123ABC*|clip
正しくは
dir /a-d 123ABC*|clip
です。
訂正
間違い 貼り付け [選択; スタイルなし; ::部品01]
正しくは 貼り付け [選択; スタイルなし; ::部品01フルパス]
です。
あと出しが続くと、ちょっと答えるのめんどくさくなります.....。
最初から最終目的も書いとくのがイイですね。
あと、返答の重要部分をすっ飛ばしているのも残念です。
EVENTを送信 [[aevt];[odoc];「cmd echo HELLO」
でcmd側の標準出力に「HELLO」と出るかテストを行ったところ、cmdは立ち上がるもののecho HELLO が送信されていない現象になっております。
コレは、オプションの「/c」とか「/k」が重要なので、
cmd echo HELLO
ではなく
cmd /c echo HELLO
または、
cmd /k echo HELLO
です。
変数を設定 [$SSS, 値:"cmd /c dir /a-d" & ::部品01 & "*|clip"]
EVENTを送信 [[aevt];[odoc];$SSS] #cmd
貼り付け [選択; スタイルなし; ::部品01]
先にも書きましたが、
「Event を送信」は、投げっぱなしのスクリプトなので、それだけでは、戻り値は取得できません。
投げっぱなしなので、コマンドの処理の終了を待ちません。
例1の様に書きましょう。
■例1
フィールド設定 [test::f1; ""]
コピー [選択; test::f1]
Event を送信 [「aevt」; 「odoc」; "cmd /c ping " & IPアドレス & " | clip"]
変数を設定 [$n; 値:0]
Loop
スクリプト一時停止/続行 [間隔(秒): 1]
貼り付け [選択; test::f1]
Exit Loop If [ not IsEmpty ( test::f1 ) or $n > 30]
変数を設定 [$n; 値:$n+1]
End Loop
dir /a-d 123ABC*|clip
では、なくFileMakerからの場合は、
dir /a-d C:\Users\user\Documents\123ABC*|clip
こう書く必要があります。
あと、ファイル名、ディレクトリにスペースや全角文字がある場合は、パスをダブルクォーテーション「"」で包む必要があります。
dir /a-d "C:\Users\user\Documents\123ABC*"|clip
式で書く場合は、
"cmd /c dir /a-d " & Quote("C:\Users\user\Documents\" & フィールド部品01 & "*") &" |clip"
です。(未検証)
あと、ドキュメントフォルダ内のすべてのファイルとフォルダの一覧は、
FileMakerの関数
Get ( ドキュメントパス一覧 )
で取得出来ます。
Last edited by qb_dp (2016-10-06 18:04:57)
Offline
PowerShellのサンプル。
今だと、DOS コマンドを使うよりPowerShellを使った方が強力です。
以下のサンプルの場合、フォルダ:Documents のサブフォルダ内も検索可能です。
フィールド f1 値:C:\Users\UserName\Documents
フィールド f2 値:123ABC*
■例1
変数を設定 [$script; 値:
Let([
script="$(Get-ChildItem -Recurse {directory} {filename}).FullName"
];
Substitute ( script ;
["{directory}" ; Quote ( SMPS::f1 )]
; ["{filename}" ; Quote ( SMPS::f2 )]
)
)]
フィールド設定 [SMPS::Result; ""]
コピー [選択; SMPS::Result]
Event を送信 [「aevt」; 「odoc」; "powershell -windowstyle hidden -command " & Quote ( $script & " | clip")]
変数を設定 [$n; 値:0]
Loop
スクリプト一時停止/続行 [間隔(秒): 1]
貼り付け [選択; SMPS::Result]
Exit Loop If [ not IsEmpty ( SMPS::Result ) or $n > 30]
変数を設定 [$n; 値:$n+1]
End Loop
■例2
プラグインを使うと、スクリプトの記述が簡単になります。
変数を設定 [$script; 値:
Let([
script="$(Get-ChildItem -Recurse {directory} {filename}).FullName"
];
Substitute ( script ;
["{directory}" ; Quote ( SMPS::f1 )]
; ["{filename}" ; Quote ( SMPS::f2 )]
)
)]
変数を設定 [$Result; 値:SMPS_Exe( $script )]
フィールド設定 [SMPS::Result; $Result]
ScriptMakerPS | FileMaker Plugin for Windows : https://sites.google.com/site/scriptmakerps/
Offline
qb_dp様
いろいろと教えていただきありがとうございます。
おかげさまで目的の動作ができるようになりました。
さらに、PowerShellはハードルが高いかなと思いスルーしていましたが、やはり強力ということで今後ぜひ活用できればいいなと思います。
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 545.64 KiB (Peak: 566.55 KiB) ]