マンガでよめる痔のこと・薬のこと

Windowsサーバから、UNIXサーバにFTPでファイル取得しようとすると、エラーがでてすすみません。
コマンドプロンプトで 対話的に動かす分には問題なく動作するのですが、バッチで動かすと
エラーがでてしまうのです。

動かそうとしているバッチファイルとその読み込みスクリプトは以下です。
(変数部分はぼかしています)

==== myftp.bat BGN ====

set dirname=%DATE:/=%
mkdir D:\master\%dirname%
ftp -s:ftpcmd.txt

==== myftp.bat END ====


==== ftpcmd.txt BGN ====

open hoge
user_naem
pass_word
bin
lcd D:\master
get file.txt
quit

==== ftpcmd.txt END ====

これらを動かすと、

スクリプト ファイル ftpcmd.txt を開くときにエラーが発生しました。

というエラーがでて前に進みません。
対話ベースでは、ftpcmt.txt ファイルの内容をコピペして、きちんと動くので、
何が原因がわかりかねています。

どなたか知恵を貸してください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

No.1です。



最初、ご質問の内容をこちらの環境でも検証しようと思い、ご質問内のファイルの内容を、ほぼそのままこちらの環境で実行してみたのですが、「200 port command successful」と表示され、うまく行きませんでした。これは恐らく、WidnwosのFTPコマンドがPASSIVEに対応していない為だと思います。

ですので、PASSIVEモードに対応したソフトでのやり方を書いていたのですが、ただ、よくご質問を見直してみたら、「スクリプト ファイル ftpcmd.txt を開くときにエラーが発生しました。というエラーがでて前に進みません。」とあったので、PASSIVEモードが原因ではないと思い、回答を書き直し、No.1の回等をさせて頂きました。

ですが、もしかしたら、いつか何かのお役に立つかも知れませんので、その時に書いた文章も、せっかくなので回答させて下さい。

もし、質問者さんの状況が許されるなら、「WinSCP」等のソフトを使った方が簡単です。コマンドラインに対応しています。

■ WinSCP
http://winscp.net/

以下の線内の内容は、WinSCPのスクリプトの例です。

「USERNAME」と、「PASSWORD」と、「example.com」と、「/file.txt」と、「G:\master\」を環境に合わせて書き換えて実行して下さい。

-----------------------
# バッチモードをオン
option batch on

# ファイル上書きの確認無効
option confirm off

# サーバーに接続
open ftp://USERNAME:PASSWORD@example.com -passive=on

# 接続先ディレクトリを変更
cd /

# バイナリモードに変更
option transfer binary

# ファイル操作(GET/PUT等)
GET "/file.txt" "G:\master\"

# 切断
close
exit
-----------------------

バッチファイルからスクリプトを実行する時は、以下の線内のようにします。ファイル名は何でも構いません。

-----------------------

WinSCP /script="スクリプトファイル.txt"

-----------------------

実行には、「WinSCP.exe」だけあれば動作しますが、「WinSCP.com」もあるとコマンドプロンプト上にスクリプト実行中の結果を表示することが出来ます。

また、「WinSCP.exe」をGUIで起動し、サーバーの設定を行うと「WinSCP.ini」に保存され、スクリプト内にパスワードを平文で記述しなくても自動認証してくれるようになります。その場合、「WinSCP.ini」は「WinSCP.exe」と同じディレクトリに置く必要があります。

その場合、スクリプト内の「open ftp://USERNAME:PASSWORD@example.com -passive=on」の「:PASSWORD」部分は削除します。

■ 参考リンク
・コマンドリファレンス - WinSCP Wiki - SourceForge.JP
http://sourceforge.jp/projects/winscp/wiki/scrip …
    • good
    • 0

こんなかんじでtest.vbsをつくって実行してみては?



Dim oShell,remoteFolder,localFolder

Set oShell = WScript.CreateObject("Shell.Application")
Set remoteFolder = oShell.NameSpace("ftp://user_naem:pass_word@hoge/")
Set localFolder= oShell.NameSpace("D:\master")
filename="file.txt"
number=getitemnumber(remoteFolder,filename)
if number>=0 then
localFolder.CopyHere remoteFolder.Items.Item(number)
msgbox "OK"
else
msgbox "NO"
end if

function getitemnumber(myfolder,filename)
number=-1
for i=0 to myfolder.Items().Count -1
if myfolder.Items().Item(i).Name=filename then
number=i
exit for
end if
next
getitemnumber=number
end function
    • good
    • 0

「ftpcmd.txt」が、仮に「C:\aaa\ftpcmd.txt」にあるとしたら、



cd /d "C:\aaa"

という一文を、バッチファイルのFTPコマンド前に記述するか、あるいは、

ftp -s:"C:\aaa\ftpcmd.txt"

として、FTPコマンドを実行されてはいかがでしょうか。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

QWINScpを使ってファイルの転送について

お尋ねします。
SSH経由でファイルを定期的に自動で転送処理をするために、WINScpを使おうと思っています。
コマンドをタスクに登録すれば、WINScpを起動させて、自動でタスクの情報を元に転送できると思うのですが、コマンドをどのように記述すればいいのか困っています。
ご存知の方おられましたら、誠に申し訳ございませんが、ご教授いただけませんでしょうか?
よろしくお願いします。

Aベストアンサー

「winscp コマンドライン」でググればたくさん出てきます。
わたくしの環境で一番上に来たブログを参考URLに入れておきます。
そちらのページに参考スクリプトがありました。

参考URL:http://diary.noasobi.net/2005/01/diary_050104a.html

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qバッチファイルで昨日の日付を取得

すみません、どなたか教えて下さい。

バッチファイルの記述で、昨日の日付を取得する方法を教えて下さい。
今日の日付は下記のように取得しています。

rem 日時変数の取得
for /f "tokens=1-3 delims=/" %%a in ('echo %date:~-10%') do (set YYYYMMDD=%%a%%b%%c
)

Aベストアンサー

:: ----- prevdate.bat はじめ -----
@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)
echo 昨日は、%yy%年%mm%月%dd%日です。

echo.
pause
:: ----- prevdate.bat おわり -----

参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html

:: ----- prevdate.bat はじめ -----
@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if...続きを読む

Qbatファイルで、call使っても戻ってこない

こんにちは
教えてほしいことがあります。

batファイルで他のbatファイルを実行するためにcallで呼び出すと、処理がまた戻ってくる事を知り、
以下のようにやってみたのですが、戻ってきている様子がありません。

どこが間違っているのか教えていただければと思います。

以下file-backup.bat

echo 処理開始 >> %LOG%
date /t >> %LOG%
time /t >> %LOG%

C:\****\Backup\FastCopy198\fastcopy.exe /cmd=force_copy /auto_close /open_window /error_stop=TRUE /log /from_date="-2D" "D:\file2" "/to=\\********\file2"

@echo off
call "Z:\file-backup2.bat"

echo 処理終了 >> %LOG% ←---これ以下がログファイルに表示されない
time /t >> %LOG%
echo. >> %LOG%


ログに「処理終了」が入ってきませんので、callで戻ってきていないと判断しました。

環境はwinserver2008です。

ご教授お願いします。

こんにちは
教えてほしいことがあります。

batファイルで他のbatファイルを実行するためにcallで呼び出すと、処理がまた戻ってくる事を知り、
以下のようにやってみたのですが、戻ってきている様子がありません。

どこが間違っているのか教えていただければと思います。

以下file-backup.bat

echo 処理開始 >> %LOG%
date /t >> %LOG%
time /t >> %LOG%

C:\****\Backup\FastCopy198\fastcopy.exe /cmd=force_copy /auto_close /open_window /error_stop=TRUE /log /from_date="-2D" "D:\file2" "/to=\\*****...続きを読む

Aベストアンサー

>どこが間違っているのか教えていただければと思います。
--> call で戻っている可能性があるのに断定している処。

> ログに「処理終了」が入ってきませんので、callで戻ってきていないと判断しました。
--> それは考えがおかしい。そう思うなら
  echo 処理終了
  とでも変えればいいです。表示されたら戻っている訳ですから。
  そもそも %LOG% には絶対パスでファイル名をセットしていますか?
  多分、カレントが変わってしまっていると予想します。

QVBSで *.txt をサーバーにFTPするには?

お世話になります。

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

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

お世話になります。

早速ですが、
「ftpserver の plt00h フォルダー に *.txt をアップロードする」VBSのプログラムを作るため、
調べたところ、「ファイルをFTPするプログラムをNameSpaceで記述できる」とあったので
見てみると、JavaScript で記述してる例でした。

この例をもとに、VBSにする挑戦をしていますが、なかなかうまくいきません。

== JS sample ============================
var oShell = WScript.CreateObject("Shell.Application");
var oFolder = oShell.NameSpace("ftp://ftpusr:ft...続きを読む

Aベストアンサー

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 ~
のようにすべきでしょう。

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
に、指定可能な数値とその意味が書かれています。
英...続きを読む

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

Qファイルの文字コードをUTF-8に変換

日次バッチで出力後のCSVファイルについて、文字コードをUTF-8(BOMなし)に変換したいのですが、
出力内容に日本語が含まれない場合、以下のコマンドだけでは変換できないようです。

<現状使用しているコマンド>
start /min /wait cmd /c chcp 65001 ^& cmd /c type c:\hoge\hoge_uni.csv > c:\hoge\hoge.csv
del /Q c:\hoge\hoge_uni.csv

お客様に相談したところ、ファイル出力の際に日本語を追加して
文字コード変換後に日本語を削除できないか、とのことでしたが
当方がコマンドに詳しくなく、解決策がありましたらご教授頂けないでしょうか?

Aベストアンサー

Unicode のコードポイント 0~127 は ASCII と全く同じ文字をコードし, かつ UTF-8 はその範囲のコードポイントをその値そのものの 1バイトで表しますから, #1 でいわれているように「いわゆるASCIIのみ」であれば BOM なしの UTF-8 と全く同じになります. つまり「変換」してもなにも変化しません.

「変換後にSJISファイルになっていて」というのはどうやって確かめているんでしょうか?

Qftpのmgetコマンドの自分の格納場所の指定方法は?

先日、ftpコマンドについてこのサイトで色々教えていただき感謝しております。

複数のファイルを受信するのにmgetコマンドを教えていただいたのですが、
相手より受信した場所の格納場所の指定が上手くいきません。

先方にFTPとしてログインでき、"PROMPT"→"MGET *"と行うのですが、受信したファイルの格納場所がCドライブの直下になってしまいます。
自分のインターネットサービスマネージャーの
ルートは別のフォルダに設定してあるのですが、これは受信したデータの初期値にはならないのでしょうか?
また、調べたところ省略すると、ワーキングディレクトリに作成されるみたいにかかれていましたが、ワーキングディレクトリはどこかで指定できるのでしょうか?

たとえばC:\AAAに受信したファイルを格納したい場合はどうやって書けばよいでしょうか?

MGET * C:\AAA見たいに色々試して見ましたが、駄目でした。

Aベストアンサー

方法は2つあります。

(1)データを格納するディレクトリに移動してからftpを起動させる。

cd 格納先ディレクトリ
ftp ホスト名
mget *

(2)ftpした後格納するディレクトリを指定する方法

ftp ホスト名
lcd 格納先ディレクトリ(自分のマシン)
mget *


lcd とは、"Local Change Directory" と思っておくと忘れなくていいですよ♪


人気Q&Aランキング