プロが教えるわが家の防犯対策術!

お世話になります。

早速ですが、
「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で作成して、実行できました。

ご指導よろしくお願いいします。

A 回答 (4件)

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ソースを書き直してみます。

補足日時:2011/10/12 23:14
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/14 03:44

No.1です。

追伸します。

念のため確認ですが、元の質問にあったJavaScriptのサンプルは
動作することを確認できていますか?
ちなみに、私はこのような方法でftpを実行したことはありません。

JavaScriptのサンプルが動作できることを確認できているのでしたら、
VBScriptに変換しても必ず動作すると思いますが、もしJavaScriptの
サンプルが動作しないのだったら、VBScriptの文法上の問題を解決しても、
結局動作しませんよ。もしそうであれば、No.2さんが指摘している通り、
JavaScriptでどううまく動作しないのか(何かエラーメッセージが出るのか、
エラーメッセージが出ないのに転送が行われないのか等)を補足してください。

この回答への補足

お世話になります。

>念のため確認ですが、元の質問にあったJavaScriptのサンプルは
>動作することを確認できていますか?

「概念的に、かっこいープログラムだなー!」と思って、動作すると鵜呑みにしていました。
JSの動作確認をしていませんでした。再度、確認してみます。

ご指導ありがとうございます。

補足日時:2011/10/12 23:10
    • good
    • 0
この回答へのお礼

お世話になります。

もとのJSソースは、実行時のエラーはでませんでしたが、
ファイル転送が行われていないようです。

もう少し調査が必要ですが、基本的な事をご指摘いただきありがとうございました。

お礼日時:2011/10/14 03:52

>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 ==========================================================

ご指導よろしくお願いします。

補足日時:2011/10/11 22:28
    • good
    • 0

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 オブジェクト
'**********************************************************

補足日時:2011/10/11 23:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています