- ベストアンサー
VBScriptでFTPサーバーに*.txtをアップロードする方法
- VBScriptを使用してFTPサーバーに特定のフォルダーに*.txtファイルをアップロードする方法を教えてください。
- VBScriptを使用して、ftpserverのplt00hフォルダーとplt00vフォルダーに*.txtと*.orgファイルをアップロードする方法を教えてください。
- FTPサーバーに*.txtファイルと*.orgファイルをアップロードするVBScriptプログラムの例を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 No.1のアドバイスをもとに、Name()メソッドで1個ずつ ファイル名を確認しながらCopyHere()する処理をVBScriptで 書こうとしてつまづいているのですよね? No.2補足の質問を回答しておきます。 (質問1) NameSpace()の正式な仕様は、 http://msdn.microsoft.com/en-us/library/bb774085(VS.85).aspx に書かれています。ここからリンクされている ShellSpecialFolderConstantsの説明 http://msdn.microsoft.com/en-us/library/bb774096(VS.85).aspx に、指定可能な数値とその意味が書かれています。 英語がつらいなら、とりあえず http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm がで雰囲気をつかむとよいと思います。 (質問3) VBScriptのIf文の比較条件式は「==」ではありません。 「=」です。 ついでに指摘を。 For i = 1 to objFolderItems.Count - 1 step 1 →「i = 0」からスタートすべきでしょう。 If ofitem.Name == "FFFTP" then oFolder.CopyHere(ofitem) →"FFFTP"と比較しても、おそらく一致するものはないでしょう。 デスクトップにFFFTPへのショートカットファイルがあって、 それを検索しているのだったら"FFFTP.lnk"とすべきでしょう。 また、元の質問にあるような"*.txt"を検索したいのだったら If LCase(Right(ofitem.Name,4)) = ".txt" then ~ のようにすべきでしょう。
その他の回答 (3)
- Lchan0211b
- ベストアンサー率61% (573/930)
No.1です。追伸します。 念のため確認ですが、元の質問にあったJavaScriptのサンプルは 動作することを確認できていますか? ちなみに、私はこのような方法でftpを実行したことはありません。 JavaScriptのサンプルが動作できることを確認できているのでしたら、 VBScriptに変換しても必ず動作すると思いますが、もしJavaScriptの サンプルが動作しないのだったら、VBScriptの文法上の問題を解決しても、 結局動作しませんよ。もしそうであれば、No.2さんが指摘している通り、 JavaScriptでどううまく動作しないのか(何かエラーメッセージが出るのか、 エラーメッセージが出ないのに転送が行われないのか等)を補足してください。
お礼
お世話になります。 もとのJSソースは、実行時のエラーはでませんでしたが、 ファイル転送が行われていないようです。 もう少し調査が必要ですが、基本的な事をご指摘いただきありがとうございました。
補足
お世話になります。 >念のため確認ですが、元の質問にあったJavaScriptのサンプルは >動作することを確認できていますか? 「概念的に、かっこいープログラムだなー!」と思って、動作すると鵜呑みにしていました。 JSの動作確認をしていませんでした。再度、確認してみます。 ご指導ありがとうございます。
- 0909union
- ベストアンサー率39% (325/818)
>VBSのプログラム書きたいのですが、なかなかうまくいきません なにが、どううまくいかないんだ! これで回答かけるなんて、質問者=回答者?
補足
お世話になります。 0909unionさんのおっしゃる通りです。 確かに、 「なにが、どううまくいかないんだ!これで回答かけるなんて、質問者=回答者?」ですね。 失礼しました。 長々、書いているとよくないかと思い、端折ってしまいました。 先日のソースを分解しながら、私なりに理解を進めているつもりですが、 今の時点で、3つあった質問のうち、1つ解決して、いま2つの質問があります。 質問1 .NameSpace(0)の数字がDESKTOPの文字列を表示するのですが、 .NameSpace(1) 、.NameSpace(2)何を意味が分かりません。 その説明が書いてあるところがありましたら、教えてください。 (→その場所か不明) 質問2 任意のフォルダーを指定して、そのフォルダーの文字列を参照するには、 どうすればいいでしょうか? (→ 自己解決しました。ソース上で実験しました。) 質問3 51.52.53の3行を加えると「C:\test\ftp\ftp00.vbs(56, 17) Microsoft VBScript コンパイル エラー: 構文エラーです。」とでます。 VBS初心者のため、エラーの箇所がわかりません。 以下が、その時のVBSのソースになります。 === ftp00.vbs ================================================== '******************************************************************** ' ftp ' '********************************************************************* Option explicit Dim oShell Dim FolderH,FolderV Dim desktop, objFolderItems Dim strTxt, strOrg, i, ofitem '********************************************************* '*** Folder のファイルやフォルダ情報取得 '********************************************************* Set oShell = WScript.CreateObject("Shell.Application") '********************************************************* '*** FTPSVER の Folder オブジェクト作成 '********************************************************* Set FolderH = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00h/") Set FolderV = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00v/") '********************************************************* '*** Folder オブジェクト作成 '** 質問1 (0)の数字が何を意味が分かりません。 '** 質問2 任意のフォルダーを指定できるのかが、わかりません? '********************************************************* Dim strPath strPath = "C:\windows" 'Set desktop = oShell.NameSpace(0) 'Set desktop = oShell.NameSpace(1) 'Set desktop = oShell.NameSpace(2) 'Set desktop = oShell.NameSpace("C:\") Set desktop = oShell.NameSpace(strPath) '********************************************************* '*** Folder Items オブジェクト作成 '********************************************************* Set objFolderItems = desktop.Items() '********************************************************* '*** Folder Items オブジェクト作成 '*** '*** '********************************************************* For i = 1 to objFolderItems.Count - 1 step 1 Set ofitem = objFolderItems.Item(i) Wscript.Echo "OfItem (" & i & ") : " & ofitem.Name '********************************************************** ' 質問3 以下の3行を加えると「C:\GCC21\test\WSH\ftp\ft0\ftp00.vbs(56, 17) ' Microsoft VBScript コンパイル エラー: 構文エラーです。」とでます。 '********************************************************** If ofitem.Name == "FFFTP" then oFolder.CopyHere(ofitem) WScript.Sleep(6000) End If Next '********************************************************** ' Folder.CopyHere (VTtem[,vOption]) ' vItem コピーする一つまたは複数のアイテムを指定 ' ファイル名を表す文字列、FolderItem オブジェクトやFolderItems オブジェクト '********************************************************** ==== ftp00.vbs ========================================================== ご指導よろしくお願いします。
- Lchan0211b
- ベストアンサー率61% (573/930)
CopyHereメソッドでワイルドカード指定はうまく動作しない場合が あるらしいです。 (参考) http://support.microsoft.com/kb/835926/ja http://support.microsoft.com/kb/835926/en-us 上記の説明に記載されている環境を使用しているなら、 パッチを適用すれば動作するようになるかもしれません。 あるいは、JSのサンプルのように、CopyHere()のパラメータに ワイルドカードを使用せず、Name()メソッドで1個ずつ ファイル名を確認し、対象ファイルであればCopyHere()する 処理に変更した方がよいかもしれません。
補足
お世話になります。 Lchan0211bさんにご指摘頂いたように、 oFolder.CopyHere("*.txt")は、通用しなかったので下のようにソースをかなり分解してみました。 コピー元のフォルダーのファイル名 ofitem.Name が "FFFTP" だったら、 FolderH.CopyHere(ofitem)として、コピー先のFTPサーバーのフォルダーに FFFTP を FTPしようとしているのですが、「(48,17)コンパイルエラー:構文エラーです。」 となっています。 <CopyHereメソッドの書式> コピー先のフォルダオブジェクトA.CopyHere(コピー元のフォルダオブジェクトB.Items) をもとに記述しているのですが、問題点が理解できていません。 何か気が付いたことがありまたら、ご指導ください。 よろしくお願いいたします。 === ftp00.vbs ========================================================== ******************************************************************** ' ftp00.vbs ' '********************************************************************* Option explicit Dim oShell Dim FolderH,FolderV Dim source, objFolderItems Dim strTxt, strOrg, i, ofitem '********************************************************* '*** Folder のファイルやフォルダ情報取得 '********************************************************* Set oShell = WScript.CreateObject("Shell.Application") '********************************************************* '*** コピー先 FTPSVER の Folder オブジェクト作成 '********************************************************* Set FolderH = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00h/") Set FolderV = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00v/") '********************************************************* '*** コピー元 Folder オブジェクト作成 '********************************************************* Dim strPath strPath = "C:\windows" Set source = oShell.NameSpace(strPath) '********************************************************* '*** コピー元 Folder Items オブジェクト数取得 '********************************************************* Set objFolderItems = source.Items() '********************************************************* '*** Folder Items オブジェクト表示 '********************************************************* For i = 1 to objFolderItems.Count - 1 step 1 Set ofitem = objFolderItems.Item(i) Wscript.Echo "OfItem (" & i & ") : " & ofitem.Name '********************************************************** ' 質問3 以下の3行を加えると「C:\GCC21\test\WSH\ftp\ft0\ftp00.vbs(47, 17) ' Microsoft VBScript コンパイル エラー: 構文エラーです。」とでます。 '********************************************************** If ofitem.Name == "FFFTP" then FolderH.CopyHere(ofitem) WScript.Sleep(6000) End If Next '********************************************************** ' Folder.CopyHere (VTtem[,vOption]) ' vItem コピーする一つまたは複数のアイテムを指定 ' ファイル名を表す文字列、FolderItem オブジェクトやFolderItems オブジェクト '**********************************************************
お礼
Lchan0211bさん。 いろいろ、ご指導ありがとうございます。 1)参照していたJSの稼働確認については、実行エラーは出てませんでしたが、 仕様通りに動いているかはわかりませんでした。 2)「*.txtをFTPSERVERへFTPするプログラム」VBS版については、 おかげさまでは、ここまで分解整理できました。 **** このプログラムの目的 ******************************** 目的「コピー元にある全てのテキストファイル(*.txt)をコピー先へ送る」 コピー元:"C:\test\ftp\ft0" コピー先:"ftp://ftpusr:ftpusr@123.11.113.123/to/" ("C:\test\ftp\js0") そのコピー先の指示先がFTPサーバーを指示する記述になっているが、ただの 同一PC内のフォルダーを指定するとファイルコピープログラムになるようです。 実行結果は、下のようになってました。 拡張子の表示がされていなかったので、もう少し調査が必要ですが、 VBSのプログラムが稼働状態になったので継続調査してみます。 ここで、一度、ご相談へのお礼をさせていただきます。 また、別のタイミングで、ご相談させていただく可能性がありますが、 今回のご回答につきましては、大変感謝しております。 いろいろ、ご指導ありがとうございました。 === ftp02.vbs ============================================================ '******************************************************************** ' Ftp Program with Shell.Application ' '********************************************************************* Option explicit Dim objShell Dim strPathTo,strPathFrom Dim source, dest Dim objFolderItemsFrom, objFolderItemsTo Dim ofitemFrom, ofitemTo, i '********************************************************* '*** シェルアプリケーションオブジェクト作成 '*** (Folder のファイルやフォルダ情報取得のため) '********************************************************* Set objShell = WScript.CreateObject("Shell.Application") '********************************************************* '*** コピー先 "ftp://ftpusr:ftpusr@123.11.113.123/to/" '*** dest : Folder オブジェクト '*** objFolderItemsTo : Items オブジェクト '*** objFolderItemsTo.Coun : Items オブジェクト Count プロパティ '*** ofitemTo : Folder Items オブジェクト '*** ofitemTo.Name : Folder 実態 '********************************************************* 'strPathTo = "ftp://ftpusr:ftpusr@123.11.113.123/to/" strPathTo = "C:\test\ftp\js0" Wscript.Echo "コピー先フォルダー strPathTo : " & strPathTo Set dest = objShell.NameSpace(strPathTo) Set objFolderItemsTo = dest.Items() For i = 0 to objFolderItemsTo.Count - 1 step 1 Set ofitemTo = objFolderItemsTo.Item(i) Wscript.Echo "OfItemTo (" & i & ") : " & ofitemTo.Name Next '********************************************************* '*** コピー元 Folder "C:\test" '*** source : Folder オブジェクト '*** objFolderItemsFrom : Folder Items オブジェクト '*** objFolderItemsFrom.Coun : Folder Items 数 '*** ofitemFrom : Folder Items オブジェクト '*** ofitemFrom.Name : Folder 実態 '********************************************************* strPathFrom = "C:\test\ftp\ft0" Wscript.Echo "コピー元フォルダー strPathFrom : " & strPathFrom Set source = objShell.NameSpace(strPathFrom) Set objFolderItemsFrom = source.Items() For i = 0 to objFolderItemsFrom.Count - 1 step 1 Set ofitemFrom = objFolderItemsFrom.Item(i) Wscript.Echo "OfItem (" & i & ") : " & ofitemFrom.Name '*** コピー元Folder内の *.txtをコピー先ディレクトリへコピー '********************************************************* If LCase(Right(ofitemFrom.Name,4)) = ".txt" then FolderH.CopyHere(ofitemFrom.Name) WScript.Sleep(6000) End If Next '********************************************************* ' End '********************************************************* === ftp02.vbs ================================================== ==ftp02.vbs 実行結果 =========================================== C:\GCC21\test\WSH\ftp\ft0>cscript //nologo ftp02.vbs コピー先フォルダー strPathTo : C:\test\ftp\js0 OfItemTo (0) : filditem2 OfItemTo (1) : flditem1 OfItemTo (2) : ftp1 OfItemTo (3) : ftp2 OfItemTo (4) : ftp3 OfItemTo (5) : getlink OfItemTo (6) : test OfItemTo (7) : test2 コピー元フォルダー strPathFrom : C:\test\ftp\ft0 OfItem (0) : a OfItem (1) : cp00.cvs OfItem (2) : ftp00 OfItem (3) : ftp01 OfItem (4) : ftp01 OfItem (5) : ftp01 OfItem (6) : ftp02 OfItem (7) : modifydate
補足
お世話になります。 ご指摘ありがとうございます。 自分の書きたいプログラムの仕様と例文がアンマッチな部分があるので、 ご指摘の内容をもとに、元のJSの動作確認と一緒に、VBSソースを書き直してみます。