お世話になります。
早速ですが、
「ftpserver の plt00h フォルダー に *.txt をアップロードする」VBSのプログラムを作るため、
調べたところ、「ファイルをFTPするプログラムをNameSpaceで記述できる」とあったので
見てみると、JavaScript で記述してる例でした。
この例をもとに、VBSにする挑戦をしていますが、なかなかうまくいきません。
== JS sample ============================
var oShell = WScript.CreateObject("Shell.Application");
var oFolder = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00h/")
var desktop = oShell.NameSpace(0);
var objFolderItems = desktop.Items();
for(var i = 0; i < objFolderItems.Count; i++) {
var ofitem = objFolderItems.Item(i);
if(ofitem.Name == "a.txt") {
oFolder.CopyHere(ofitem);
WScript.Sleep(6000);
break;
}
}
====================================================
上のコードをもとに、
「ftpserver の plt00h フォルダー に *.txt を,plt00vに *.org をアップロードする」
VBSのプログラム書きたいのですが、なかなかうまくいきません。
== VBS =============================================
Option explicit
Dim oShell, FolderH, FolderV, desktop, objFolderItem
Set oShell = WScript.CreateObject("Shell.Application")
Set FolderH = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00h/")
Set FolderV = oShell.NameSpace("ftp://ftpusr:ftpusr@ftpserver/plt00v/")
Set desktop = oShell.NameSpace(0)
Set objFolderItems = desktop.Items()
FolderH.CopyHere("*.txt") ← FTPサーバーのplt00h ヘ*.txtをアップロード?
FolderV.CopyHere("*.org") ← FTPサーバーのplt00v ヘ*.orgをアップロード?
WScript.Sleep(6000)
====================================================
FTPホスト :ftpserver,
FTPユーザ :ftpusr
FTP パスワード :ftpusr
FTP先DIR :plt00h, plt00v
送信対象ファイル: :*.txt, *.org
ちなみに、 ftp -s: ftp.txt の方式は、VBSで作成して、実行できました。
ご指導よろしくお願いいします。
No.3ベストアンサー
- 回答日時:
No.1です。
No.1のアドバイスをもとに、Name()メソッドで1個ずつ
ファイル名を確認しながらCopyHere()する処理をVBScriptで
書こうとしてつまづいているのですよね?
No.2補足の質問を回答しておきます。
(質問1)
NameSpace()の正式な仕様は、
http://msdn.microsoft.com/en-us/library/bb774085 …
に書かれています。ここからリンクされている
ShellSpecialFolderConstantsの説明
http://msdn.microsoft.com/en-us/library/bb774096 …
に、指定可能な数値とその意味が書かれています。
英語がつらいなら、とりあえず
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/ …
がで雰囲気をつかむとよいと思います。
(質問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 ~
のようにすべきでしょう。
この回答への補足
お世話になります。
ご指摘ありがとうございます。
自分の書きたいプログラムの仕様と例文がアンマッチな部分があるので、
ご指摘の内容をもとに、元のJSの動作確認と一緒に、VBSソースを書き直してみます。
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
No.4
- 回答日時:
No.1です。
追伸します。念のため確認ですが、元の質問にあったJavaScriptのサンプルは
動作することを確認できていますか?
ちなみに、私はこのような方法でftpを実行したことはありません。
JavaScriptのサンプルが動作できることを確認できているのでしたら、
VBScriptに変換しても必ず動作すると思いますが、もしJavaScriptの
サンプルが動作しないのだったら、VBScriptの文法上の問題を解決しても、
結局動作しませんよ。もしそうであれば、No.2さんが指摘している通り、
JavaScriptでどううまく動作しないのか(何かエラーメッセージが出るのか、
エラーメッセージが出ないのに転送が行われないのか等)を補足してください。
この回答への補足
お世話になります。
>念のため確認ですが、元の質問にあったJavaScriptのサンプルは
>動作することを確認できていますか?
「概念的に、かっこいープログラムだなー!」と思って、動作すると鵜呑みにしていました。
JSの動作確認をしていませんでした。再度、確認してみます。
ご指導ありがとうございます。
お世話になります。
もとのJSソースは、実行時のエラーはでませんでしたが、
ファイル転送が行われていないようです。
もう少し調査が必要ですが、基本的な事をご指摘いただきありがとうございました。
No.2
- 回答日時:
>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 ==========================================================
ご指導よろしくお願いします。
No.1
- 回答日時:
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 オブジェクト
'**********************************************************
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- サーバー Googleドライブなどを使わずにテザリングAndroidでWindowsとファイル共有 1 2023/02/19 13:14
- その他(インターネット接続・インフラ) 楽天ひかりでホームページアップロードが出来ない 1 2022/07/30 10:02
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- プロバイダー・ISP hpb22の接続方法の変更 1 2023/08/06 18:47
- PHP ファイルアップロードの上限を増やす 7 2023/06/23 12:50
- サーバー Laravelをレンタルサーバーにインストールするにはどうすればいいですか? 2 2022/06/29 10:17
- ドメイン・サーバー・クラウドサービス FileZillaを使用してwpXサーバーに接続できない 2 2022/03/29 21:02
- サーバー FFFTPで特定サイトだけUploadできない 4 2022/08/27 14:53
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
VBSでFTPを記述できますか?
その他(プログラミング・Web制作)
-
FTPの送信結果を検知したい
その他(プログラミング・Web制作)
-
WSH.Run の処理内容をテキストに落とすには
その他(プログラミング・Web制作)
-
-
4
WshShellから起動したbat(ftp)の応答メッセージを取得するには
Visual Basic(VBA)
-
5
FTPでputすると空ファイルが出来てしまう
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
VBAでワークシートを引数として...
-
FTPのコマンド「mput」について
-
テキストファイルで提出とは?
-
C言語、ファイルの存在チェック...
-
テキストの保存
-
VBAでエクセルをtxtに変換する...
-
javaでemlファイルからtxtファ...
-
COPYコマンドで結合すると余計...
-
ファイルの最後に文字列挿入
-
【csh】ファイルの中の値を配列...
-
多数のサブディレクトリ内のフ...
-
テキストファイルのファイル名...
-
コマンドプロンプトでのファイ...
-
バッチファイルで文字列削除に...
-
エクセルの各セルの内容をそれ...
-
ハードディスク上書き用大容量...
-
VB6.0 でのテキストファイルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報