「WSH (Windows Script Host)」初心者です。

C:¥AAAというフォルダから、あるサーバーにアップロードするvbsがあります。
現行、バッチファイルやログファイルもC:¥AAAに作成されるように固定で指定されているのですが、これをC:直下でもマイドキュメントでもいいから、vbsファイルのあるフォルダで動かせるように相対パスに変更したいと思っています。

バッチファイルをOPENした後、
ts.WriteLine "cd c:¥AAA"
ts.WriteLine "FTP -s:ftp_aaa.prm > ftp_aaa.log"
ts.WriteLine "bye"
ts.Close
と書き込んでいる部分があり、1行目を直す必要があると思うのですが、どうしてもバッチファイル実行時にエラーとなってしまいます。

急に必要になって、ろくに勉強せずにやろうとしているので、基本的な知識が欠落しているのだろうとは思います。
どうかよろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/01/29 22:51:47
  • 終了:2007/02/03 01:01:02

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/01/29 23:18:23

ポイント100pt

もしかしたら、先ほどの回答は少し質問を読み違えたでしょうか。

先ほどの回答は、任意のパスを指定するための方法です。


ドライブも含めてパスを変更したい場合は、

 "cd /D ""D:\Data\FTP"""

とすれば出来ます(余計なことですが、せっかくの回答なので御参考まで)。


本題ですが、カレントフォルダで実行するには、CD の行を削除するだけで良いかと思います。


デフォルトのパスは、スクリプトのある場所になるので、

ftp_aaa.prm も ftp_aaa.log もスクリプトと同じ場所でよければ、それで出来ると思います。


蛇足ですが、先ほどの回答での誤変換失礼しました。

× 含まれている

○ 含まれているせい

id:nozora

早速ありがとうございます。

>カレントフォルダで実行するには、CD の行を削除するだけで良いかと思います。

やっぱりまずはそう考えますよね。昨日やってみた時はうまくいかなかったような・・・。


今はちゃんとアップロードできる環境ではないのですが試しに実行してみたら、Not connected.だったけど、エラーにならずに無事終了した・・・。

明日午後に試してみますね。

2007/01/29 23:30:50

その他の回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/01/29 23:04:37

ポイント27pt

おそらく変更しようとしているパスにスペースが含まれている星ではないかと思います。

ts.WriteLine "cd ""c:\Documents and Settings\AAA"""

のようにパスの前後にダブルコーテーションを入れてあげてはどうでしょうか。


ダブルコーテーション中の連続するダブルコーテーションは、文字列としてのダブルコーテーションを表します(わかりずらいですが)。


あと気になったのはが全角になっていました。

id:nozora

ちょっと質問文が悪かったかと思います。

¥(全角)はわざとしましたが、要は"cd c:/AAA"です。cdとcの間以外は余計なスペースはありません。


確かcdはカレントディレクトリを移動する時に指定するものだと記憶にありますが、要は相対パスは指定できるのか?もしできるとしたら、どういう指定の仕方をすればいいかということです。

その程度のレベルです。


いろいろ自分でやってみてもうまくエラーになるだけでした。

もしよろしかったら、再度回答をお願いします。

2007/01/29 23:16:14
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/01/29 23:18:23ここでベストアンサー

ポイント100pt

もしかしたら、先ほどの回答は少し質問を読み違えたでしょうか。

先ほどの回答は、任意のパスを指定するための方法です。


ドライブも含めてパスを変更したい場合は、

 "cd /D ""D:\Data\FTP"""

とすれば出来ます(余計なことですが、せっかくの回答なので御参考まで)。


本題ですが、カレントフォルダで実行するには、CD の行を削除するだけで良いかと思います。


デフォルトのパスは、スクリプトのある場所になるので、

ftp_aaa.prm も ftp_aaa.log もスクリプトと同じ場所でよければ、それで出来ると思います。


蛇足ですが、先ほどの回答での誤変換失礼しました。

× 含まれている

○ 含まれているせい

id:nozora

早速ありがとうございます。

>カレントフォルダで実行するには、CD の行を削除するだけで良いかと思います。

やっぱりまずはそう考えますよね。昨日やってみた時はうまくいかなかったような・・・。


今はちゃんとアップロードできる環境ではないのですが試しに実行してみたら、Not connected.だったけど、エラーにならずに無事終了した・・・。

明日午後に試してみますね。

2007/01/29 23:30:50
id:garyo No.3

garyo回答回数1782ベストアンサー獲得回数962007/01/29 23:44:43

ポイント26pt

まず、現状は

1.C:\AAAのフォルダの中に「○○.vbs」,「ftp_aaa.prm」,「uploadする対象のファイル」があり「○○.vbs」を実行すると「ftp_aaa.log」が作成される

だと思います。

これをどのように変更したいのでしょうか?

1.任意のフォルダに「○○.vbs」,「ftp_aaa.prm」,「uploadする対象のファイル」を移動したい。

→この場合は2番の回答で問題ないと思います。

2.任意のフォルダに「○○.vbs」を移動し,「ftp_aaa.prm」,「uploadする対象のファイル」はc:\AAAのまま実行したい。

→この場合は

ts.WriteLine "cd c:¥AAA"←削除

ts.WriteLine "FTP -sc:¥AAA\ftp_aaa.prm > c:¥AAA\ftp_aaa.log"

で良いのではないでしょうか。

また「どうしてもバッチファイル実行時にエラーとなってしまいます。」このときのエラーメッセージを書くと解決が早いと思います。

id:nozora

現状はその通りです。

元のvbsは問題なく動きます。


変更したいこと

→1.です。

このvbsを他の人に渡して、任意のフォルダで実行、その人の持つファイルをアップロードしてもらうことです。

その際に作成されるprmやlogはvbsと同じフォルダです。

今日、「ts.WriteLine "cd c:¥AAA"」の部分を削除して実行してみました。

Mookさんのコメントにもありましたので、全文とエラーを書きます。

元のvbsからフォルダ指定を消して、ID・パスワード・ディレクトリ・ファイル名を変えてあります。

Set objWS = WScript.CreateObject("WScript.Shell")

Set objSA = WScript.CreateObject("Shell.Application")

Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

Set objXL = WScript.CreateObject("excel.Application")

Set ts = objFS.OpenTextFile("ftp_aaa.bat",2,true)

ts.WriteLine "FTP -s:ftp_aaa.prm > ftp_aaa.log"

ts.WriteLine "bye"

ts.Close

do

FileName = objXL.GetOpenFilename(,,"Uploadファイル選択",,true)

If IsArray(FileName) Then

Set ts = objFS.OpenTextFile("ftp_aaa.prm",2,true)

ts.WriteLine "open 44.555.33.66" ←IPアドレス

ts.WriteLine "FTPID"        ←ID

ts.WriteLine "FTPPW"       ←パスワード

ts.Writeline "cd AAADIR"     ←アップロード先のサーバーのディレクトリ

For i = 1 To UBound(FileName)

ts.WriteLine "put " & FileName(i)

Next

ts.WriteLine "bye"

ts.Close

Ans = Msgbox(UBound(FileName) & "件のデータをUploadします。",vbOkCancel,"○○データUpload")

If Ans = vbOk Then

objWS.run "ftp_aaa.bat",0,true

Ans = Msgbox("データのUpload完了しました。" & vbCrLf & "処理を終了しますか?", _

vbOkCancel,"○○データUpload")

If Ans = vbOk Then

Wscript.Quit

End IF

End if

Else

Wscript.Quit

End if

LOOP

出たエラーメッセージの内容は

スクリプト:c:\test\○○データUpload.vbs

行:24

文字:12

エラー:処理を待つことができません。

コード:80020009

ソース:WshShell.Run

okを押すと、webブラウザにてメッセージ表示。

プロキシ サーバーがフルアクセスできない設定にされていないため、

フォルダ'ftp://aaa.bat/'は読み取り専用です。


ファイルを移動、貼り付け、名前の変更、または削除するには、

別のプロキシを設定する必要があります。

プロキシの変更の詳細については、システム管理者に問合せてください。


すいません。お手数かけますが、よろしくお願いします。

2007/01/30 14:26:16
  • id:Mook
    コメントが書けたのですね。
    こちらで、もう少し仕様を確認してからの方が良かったかもしれません。

    2回目の回答でもおかしい場合は、プログラムの全容を提示いただけますか。
    バッチを作成するスクリプトのようですが、バッチファイルのパスを考慮する必要がある場合、話が少し変わってきます。


    上記の回答は、バッチも含めてすべてのファイルが同一フォルダで処理されている場合のみ有効となります。
  • id:nozora
    garyoさんへの返信で全文とエラー内容を書きました。
    上限を上げましたので、もし何か問題点が見つかったら回答の方をお願いします。
    質問の書き方が悪くてすいません。
  • id:Mook
    こちらで簡単に(ファイル読取部分ははずして)テストしてみましたが、問題なく動くようです。

    問題となりそうなのは実行したユーザ環境ですが、ファイルを実行したフォルダのアクセス権等は問題ないでしょうか。

    まずは作成された ftp_aaa.prm と ftp_aaa.bat の中身を正常な場合と動作がおかしい場合で比べてみてください。
    これが問題なさそうな場合は、生成された ftp_aaa.bat を単独で動かしてみてください。
    その結果を教えていただけますか。
    もし、それでエラーがでないようであれば、スクリプトの問題ですし、問題がでるようであれば、生成された BAT 側にも問題があります。
  • id:nozora
    Mookさん、わざわざありがとうございます。

    >ファイルを実行したフォルダのアクセス権等は問題ないでしょうか。
    元のvbsと環境は変えてないですし・・・。ためしにユーザーを変えてみましたが、やはりエラーになりました。

    >作成された ftp_aaa.prm と ftp_aaa.bat の中身を正常な場合と動作がおかしい場合で比べてみてください。
    特におかしい点は見つかりませんでした。

    >生成された ftp_aaa.bat を単独で動かしてみてください。
    動かしてみたところ、dos画面が開いて普通に終わったようなので、確認してみたところ、無事アップロードされていました!logもOKです。

    生成された BAT は特に問題ないようなので、24行目でエラーとなっていたのが気になり、
    objWS.run "ftp_aaa.bat",0,true
    に"c:\aaa"を追加してみたら無事に実行できて、パスを抜くとエラーになるようです。

    参考にさせてもらっている
    http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/
    を見ても、runの時は別にファイル指定のみでも良いらしいし・・・。
    24行目に来た時点でカレントディレクトリが変になってbatが見つからないのか???
    もう少し調べてみます。
  • id:Mook
    こちらの環境で全ての処理を実施してみましたが、
    パスを指定しない状態で、問題なく動作します。


    と書いていて、気になったのですがこれを動かしているのは、ネットワーク上のフォルダでは無いですか?

    バッチはネットワークパス(UNC)を処理できません。
    ならば、直接 ftp を Run したらとも思いましたが、FTP コマンド自体も UNC を処理できるかどうか怪しい気がします。
    ftp_aaa.prm の中に、\\hogehoge\...
    というようになっていませんか?

    この場合、処理をしているフォルダをネットワークドライブに割り当てて、ドライブ上でスクリプトを動かせばできると思います。
    的外れでしたらすみません。
  • id:nozora
    返事が遅くなってすみません。
    実行するのは個人PCのローカルドライブ(C)ですが、アップロード先は社内LANのサーバーです。
    ちなみに今回、試した私のPCのOSはwin2000でした。

    ネットワーク的なことはよくわからないのですが、Mookさんの環境でちゃんと動くということは、ファイルの中身ではなく環境的な問題の可能性が高そうですね。
    そこを詳しく説明できれば問題点がわかるのかもしれませんが、いろんな点で難しいです。

    ・ftp_aaa.prm の内容です。IPなどダミーです。
    >>
    open 44.555.33.66
    FTPID
    FTPPW
    cd AAADIR
    put C:\AAA\atest.txt
    bye
    <<
    ・ftp_aaa.batの内容
    >>
    FTP -s:ftp_aaa.prm > ftp_aaa.log
    bye
    <<

    本日、依頼者と話したら、どうやらC:\AAAのままでも良さそうな気配でした。じゃあってことで結局、C:\AAA固定ということで決まり。
    すっきりしない幕切れですが、そういうことになりました。
    なんだか本業とは違う分野で苦労させられました。

    それにしても、Mookさんには何度も親切に対応していただき、感謝しております。ありがとうございました。
  • id:Mook
    多くのポイントとイルカありがとうございました。
    イルカ賞、回答の励みになります。

    最後の情報をみて気になったのですが、C:\aaa は実行場所ではなく、送信ファイルの場所のように見えるのですが、そうだったのでしょうか?
    だとしたら、これまでのやり取りはお互いピントがずれていたかもしれません。

    そうだとしたらput のぶぶんが気になるのですが、
    ts.WriteLine "put " & FileName(i)

    ts.WriteLine "put """ & FileName(i) & """"
    としてみたらどうでしょうか。

    最初はパスに空白があるかもしれないということで、cd のパスについて解答しましたが、これは送信ファイルのパスにスペースがあった場合も同様に問題になります。

    表示されるエラーからは、ちょっと違うような気もしますが、一応情報まで。的外れでしたら、失礼しました。
  • id:ardarim
    質問終わってしまってますが参考まで。

    Wscript.ScriptFullName で実行しているvbsファイルのフルパスを取得できますので、ここからvbsのあるフォルダを取得できます。詳細は以下に。

    スクリプトを実行しているフォルダへのパスを特定する方法はありますか
    http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/apr06/hey0405.mspx
  • id:nozora
    すみません。コメントに気づくのがおそくなりました。

    Mookさん、
    vbsファイルと送信ファイルを便宜的に同じファイルに入れているせいで、混乱を招いたかもしれません。
    今回のエラーには直接関係なさそうですが、ダブルコーテーションで囲む方法は参考にさせていただきます。
    ありがとうございました。

    ardarimさん、
    情報ありがとうございます。
    今はいろいろとやることが増えてしまって、じっくり検証できないですが、ブックマークして参考にさせていただきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません