FILEMAKER プラグイン など (助け合い)フォーラムにようこそ!
何方でも、ご質問・ご回答お願いします。
※2024/01/31 までに登録された方は、登録時のパスワードが使えません。
パスワードを再発行してください。
環境
WIN7 FM13AD powershell
いつもお世話になります。
宜しくお願い致します。
ファイルメーカーとpowershellを使用して、
FTPで接続後、最後のcsvファイルをダウンロードする方法について教えてください。
powershellで下記の記述により、ファイルをダウンロードするところまでできました。
------------------------------------------------------------------------------------------------------
# パスワード等を設定
$user ='abc'
$password = '123456'
$url = 'ftp://upload.abc.ne.jp'
# FTP認証 Nework.CredentialではなくPSCredentialを使用
$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($user,$str)
# データのダウンロード
Invoke-WebRequest -Uri "$url/ritem/logs/item.20180825215009598.csv" -OutFile "C:\Users\xps\Downloads\filename.csv" -Credential $cred
--------------------------------------------------------------------------------------------------------
ただ、-Uriの指定で個別のファイルを指定してダウンロードはできるのですが
最後のファイルをダウンロードすることができません。
どのように記述すればよろしいでしょうか?
下記のように記述をしてみたのですが、エラーがでます。
Invoke-RestMethod -Uri "$url/ritem/logs/" | Select-Object -Last 1
パイプの使い方や変数の使い方がわかりません。
この部分の正しい記述を教えていただけますと助かります。
また、上記はpowershellだけの記述となります。
ファイルメーカー+powershellで動作させたいと考えております。
下記のように作成してみましたが、うまく動作しませんでした。
どこの記述がおかしいでしょうか?
---------------------------------------------------------------------------------------------------
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($Username,$str)
Invoke-WebRequest -Uri 'ftp://upload.abc.ne.jp/ritem/logs/item. … 009598.csv' -OutFile 'C:\Users\xps\Downloads\filename.csv' -Credential $cred
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
)
];
SMPS_Exe( Script )
)
-----------------------------------------------------------------------------------------------------------------------
いろいろと長く記述して申し訳ございません。
ご教授いただけますと幸いです。
宜しくお願い申し上げます。
オフライン
FileMakerのスクリプト内の計算式に記述する場合は、行末に ; が必要です。
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$str=ConvertTo-SecureString $password -AsPlainText -Force;
$cred=New-Object System.Management.Automation.PSCredential($Username,$str);
Invoke-WebRequest -Uri 'ftp://upload.abc.ne.jp/ritem/logs/item. … 009598.csv' -OutFile 'C:\Users\xps\Downloads\filename.csv' -Credential $cred;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
)
];
SMPS_Exe( Script )
)
>最後のファイルをダウンロードすることができません。
>下記のように記述をしてみたのですが、エラーがでます。
>Invoke-RestMethod -Uri "$url/ritem/logs/" | Select-Object -Last 1
Invoke-RestMethod では、FTPディレクトリ内のファイルの一覧は取得できないと思います...たぶん。
FTPディレクトリ内のファイルの一覧は取得は、以下が参考になると思います。
PowerShellでFTPサーバのファイルを一覧する
https://qiita.com/sengoku/items/d214e7a8d1e399b42b18
オフライン
ご回答をいただきましてありがとうございます。
また、単純なミスをしておりました。
「FileMakerのスクリプト内の計算式に記述する場合は、行末に ; が必要です。」
のことを今後気をつけて参ります。
行末に ; をつけたところ、ファイルメーカー+powershellで動作確認できました。
ありがとうございます。
また、ご指摘のとおり、Invoke-RestMethodではファイル名の一覧を取得することはできませんでした。
そこでご参考をいただいた下記から、ファイルの一覧をpowershell ISE上で表示できました。
https://qiita.com/sengoku/items/d214e7a8d1e399b42b18
表示できたのですが、ここからが難題でいろいろと調べたのですが、型やパイプなど理解できないでおり
最後のファイル名を取得する方法がわからない状態です。
最後のファイル名だけ、抽出するにはどのような記述となりますでしょうか?
ファイル名だけ取り出せれば、下記記述を利用してダウンロードができます。
「Invoke-WebRequest -Uri 対象URI -OutFile 保存するローカルパス」
「対象URI」の部分に最後のファイル名だけわかれば、解決できそうです。
例:item20180903.csv
ファイル名の抽出ができればよいのですが、.NETなのかpowershell なのか混乱しております。
お手数となりますが、ご教授のほど宜しくお願い申し上げます。
オフライン
>最後のファイル名だけ、抽出するには.....
「最後の...」とは? 何順の最後でしょうか?
ファイル名の場合だと、
https://qiita.com/sengoku/items/d214e7a8d1e399b42b18
上記のコード、下記赤部分の書き換え・追加でファイル名・昇順 の最後のファイル名が取得できます。
$wr = [System.Net.WebRequest]::Create($url)
$wr.Credentials = New-Object System.Net.NetworkCredential($user, $pass)
$wr.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory
$res = $wr.GetResponse()
$rs = New-Object System.IO.StreamReader($res.GetResponseStream())
$list = $rs.ReadToEnd()
$rs.Close()
$arrey=$list.Split("`n");
$arrey | Sort-Object | Select-Object -Last 1;
オフライン
ご回答ありがとうございます。
上記の記述で問題なく、最後のファイル名を取得できました。
powershell ISE上で確認ができました。
ありがとうございます。
上記の内容を含め、ファイルメーカー+powershellの記述をしました。
ですが、記述が違うのかダウンロードができませんでした。
$url2の値が取得できていないようなのです。
-------------------------------------------------------------------------------
Let([
Script=
"
$Url = '{Url}';
$Username = '{Username}';
$Password = '{Password}';
$wr = [System.Net.WebRequest]::Create($Url);
$wr.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$wr.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory;
$res = $wr.GetResponse();
$rs = New-Object System.IO.StreamReader($res.GetResponseStream());
$list = $rs.ReadToEnd();
# 「item-cat.」を除外した昇順の最後のファイル名(csvファイル)を取得
$arrey = $list.Split('`n');
$matches = $arrey -notmatch 'item-cat.';
$url2 = $matches | Sort-Object | Select-Object -Last 1;
# Invoke-WebRequestを使用して上記のファイル($url2)をダウンロード
$str=ConvertTo-SecureString $password -AsPlainText -Force;
$cred=New-Object System.Management.Automation.PSCredential($Username,$str);
Invoke-WebRequest -Uri 'ftp://upload.abc.ne.jp/ritem/logs/$url2' -OutFile 'C:\Users\xps\Downloads\filename.csv' -Credential $cred;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
;["{Url}" ; $Url]
)
];
SMPS_Exe( Script )
)
-------------------------------------------------------------------------------
ダブルクォーテーションやシングルクォーテーションの記述が異なりますか?
それとも$Urlの値の入れ方が異なりますか?
powershell ISE上ではpowershell ISEの記述方法でダウンロードすることができました。
大変お手数となりますが、ご教授のほど宜しく願い申し上げます。
オフライン
検証はしていませんが、
# 「item-cat.」を除外した昇順の最後のファイル名(csvファイル)を取得
FileMakerのスクリプト中にPowerShellを記述する場合、コメントは<#コメント#> を使用してください。
※スクリプト中に記述した場合、改行が無視されます。
<#「item-cat.」を除外した昇順の最後のファイル名(csvファイル)を取得#>
オフライン
お世話になります。
ご返信が大変遅くなりました。
コメントのご指摘ありがとうございます。
また、初歩的なことでご丁寧にご指導いただきましてありがとうございます。
ただ、コメントを正しくしても、うまく動作しませんでした。
いろいろと模索した結果、いくつか修正しないと動作しませんでした。
修正をしたのはシングルクォーテーションの部分を変数にして、変数の値は
別途フィールドを作成して、そこに値を入れました。
パスワードと同じ設定です。
また、スクリプトを分けて、動作させました。
成功した内容を記述いたします。
-------------------------------------------------------------------------------------
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$url = '{url}';
$n = '{n}';
$match = '{match}';
$wr = [System.Net.WebRequest]::Create($url);
$wr.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$wr.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory;
$res = $wr.GetResponse();
$rs = New-Object System.IO.StreamReader($res.GetResponseStream());
$list = $rs.ReadToEnd();
$arrey=$list.Split($n);
$matches = $arrey -notmatch $match;
$matches | Sort-Object | Select-Object -Last 1;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
;["{url}" ; $url]
;["{n}" ; $n]
;["{match}" ; $match]
)
];
SMPS_Exe( Script )
)
---------------------------------------------------------------------------------------
変数を設定でスクリプトを分けております。
二つ目は下記、記述です。
---------------------------------------------------------------------------------------
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$url = '{url}';
$path = '{path}';
$str=ConvertTo-SecureString $Password -AsPlainText -Force;
$cred=New-Object System.Management.Automation.PSCredential($Username,$str);
Invoke-WebRequest -Uri $uri -OutFile $path -Credential $cred;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $Password]
;["{url}" ; $url]
;["{path}" ; Substitute ( Replace ( Get ( デスクトップパス ) ; 1 ; 1 ; "" ) ; ["/" ; "\\"] ; ["Desktop\\" ; ""] ) & "Downloads\filename.csv"]
)
];
SMPS_Exe( Script )
)
---------------------------------------------------------------------------------------
このように記述して、うまく動作することができました。
ありがとうございます。
また、今回なぜこれを必要としていたかと申し上げますと
楽天の商品登録で必要となりました。
商品を毎日出品しておりますが、まだ楽天に登録されていない商品を
ファイルメーカーに取り込むために必要でした。
通常はコントロールカラム「u」で更新ができるのですが、登録されていないと
楽天のログファイル「ritem/logs/」にその情報が残ります。
このファイルをダウンロードするためでした。
これで更新と新規商品の登録が半ば、自動的に登録できるようになりました。
ありがとうございます。
理解するのに時間がかかりますが、できあがると本当に便利ですね。
PowerShellを理解するのに難易度は上がりますが、がんばって参ります。
この度も丁重にご指導をいただきまして本当にありがとうございました。
感謝いたします。
オフライン
[ 0.007 秒でページを生成, 9 クエリーを実行 - 使用メモリー: 582.66 KiB (ピーク: 598.57 KiB) ]