[前の記事]« 書き込まれた数値が条件に合致する行だけ別ファイルに出力したい
[次の記事]FOR文中のCALLがうまくいきません »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FTP」索引へ

FTP実行中のエラーの有無をバッチ処理側で判別するには

684.
バッチでのFTP
2005年08月04日(木) 16時50分
リラックマ
●DOS/Windowsのバージョン↓

windowsXP

本当に初心者の質問で申し訳ありませんが、
どうしても分からないので、どなたか教えてください。

あるファイルをFTPでPUTする、という処理をバッチファイルで行っています。

使っているファイルは以下の二つです。
1 a.bat
 ftp -s:c:\b.bat
2 b.bat
 open ****
 anonymous
 put ファイル名
 ・・・

といった内容なのですが、
2b.batでログインエラーなどのエラーが起きたときに、
1のa.batにエラーを返す、
という処理は可能でしょうか?

JP1を使ってスケジューリングしているため、
1のファイルが使われた時点で、2でエラーが起きても、正常終了となってしまうので、どうにかして
解決したいのです。

分かりにくい文章で申し訳ありませんが、
どなたか教えていただけるとありがたいです。
686.
Re:バッチでのFTP
2005年08月05日(金) 12時03分
otn
>●DOS/Windowsのバージョン↓
>windowsXP
>
>あるファイルをFTPでPUTする、という処理をバッチファイルで行っています。

>JP1を使ってスケジューリングしているため、
>1のファイルが使われた時点で、2でエラーが起きても、正常終了となってしまうので、どうにかして
>解決したいのです。

一般に、Windowsでもunixでもftpのサブコマンドが正常終了したかしなかったかをftpコマンドのリターンコードで判断する事は出来ません。
ftpのログを書き出して、調べるしかないです。
例:
ftp -s:b.bat >ftp.log
find "530 Login incorrect." ftp.log >NUL && exit /b 1
find "File not found" ftp.log >NUL && exit /b 1
....(その他、起こり得るエラーを列挙する)
exit /b 0
687.
Re:バッチでのFTP
2005年08月05日(金) 19時33分
otn
>>●DOS/Windowsのバージョン↓
>>windowsXP
>>
>>あるファイルをFTPでPUTする、という処理をバッチファイルで行っています。
>
>>JP1を使ってスケジューリングしているため、
>>1のファイルが使われた時点で、2でエラーが起きても、正常終了となってしまうので、どうにかして
>>解決したいのです。
>
>一般に、Windowsでもunixでもftpのサブコマンドが正常終了したかしなかったかをftpコマンドのリターンコードで判断する事は出来ません。
>ftpのログを書き出して、調べるしかないです。
>例:
>ftp -s:b.bat >ftp.log
>find "530 Login incorrect." ftp.log >NUL && exit /b 1
>find "File not found" ftp.log >NUL && exit /b 1
>....(その他、起こり得るエラーを列挙する)
>exit /b 0

起こり得るエラーの列挙って難しいので、

for /f %%A in ('findstr /b /c:"226 " ftp.log^|find /c "226"') do set OKCNT=%%A

というふうに転送成功メッセージの数を数えるのがいいかな。
で、if 文で比較して exit /b 0 か exit /b 1 かする。
688.
Re:バッチでのFTP
2005年08月08日(月) 18時09分
KBZN
私も今リラックマさんと同じことで悩んでいまして、
ここを参考にさせていただいてバッチファイルを作成してみたのですが、
JP1を使ってftpでログを出力するバッチファイルを実行しても
ログにはコードの部分が全く出力されないようです。
バッチファイルそのものを実行すると上手くいくんですが・・・

JP1を使った実行の場合のログ*************************
User (HOSTNAME:(none)): open localhost



cd /host
put c:\Send\test.dat
quit
************************************************

JP1を使わないで実行したの場合のログ**********************
ftp> Connected to HOSTNAME.

open localhost
220 HOSTNAME Microsoft FTP Service (Version 5.0).
User (HOSTNAME:(none)): 
331 Anonymous access allowed, send identity (e-mail name) as password.

230 Anonymous user logged in.
ftp> ftp> 
cd /host
250 CWD command successful.
ftp> put c:\Send\test.dat
200 PORT command successful.
150 Opening ASCII mode data connection for test.dat.
226 Transfer complete.
ftp: 1694000 bytes sent in 0.14Seconds 12014.18Kbytes/sec.

ftp> quit
221  
************************************************

リラックマさんは解決したのでしょうか??


>>>●DOS/Windowsのバージョン↓
>>>windowsXP
>>>
>>>あるファイルをFTPでPUTする、という処理をバッチファイルで行っています。
>>
>>>JP1を使ってスケジューリングしているため、
>>>1のファイルが使われた時点で、2でエラーが起きても、正常終了となってしまうので、どうにかして
>>>解決したいのです。
>>
>>一般に、Windowsでもunixでもftpのサブコマンドが正常終了したかしなかったかをftpコマンドのリターンコードで判断する事は出来ません。
>>ftpのログを書き出して、調べるしかないです。
>>例:
>>ftp -s:b.bat >ftp.log
>>find "530 Login incorrect." ftp.log >NUL && exit /b 1
>>find "File not found" ftp.log >NUL && exit /b 1
>>....(その他、起こり得るエラーを列挙する)
>>exit /b 0
>
>起こり得るエラーの列挙って難しいので、
>
>for /f %%A in ('findstr /b /c:"226 " ftp.log^|find /c "226"') do set OKCNT=%%A
>
>というふうに転送成功メッセージの数を数えるのがいいかな。
>で、if 文で比較して exit /b 0 か exit /b 1 かする。
689.
Re:バッチでのFTP
2005年08月08日(月) 21時07分
リラックマ
こんばんわ。

>otnさん

>起こり得るエラーの列挙って難しいので、
>
>for /f %%A in ('findstr /b /c:"226 " ftp.log^|find /c "226"') do set OKCNT=%%A
>
>というふうに転送成功メッセージの数を数えるのがいいかな。
>で、if 文で比較して exit /b 0 か exit /b 1 かする。

どうもありがとうございます!
返信が遅れて申し訳ありません。

教えていただいた方法で試してみたのですが、どうもうまくいきません。

出されるログが、

cd /host
put c:\Send\test.dat
quit

としかありません。

JP1を使用しているからだと思うのですが、こういった場合
の記述方法はあるのでしょうか。

ご存知でしたら、よろしくお願いいたします。



>リラックマさんは解決したのでしょうか??
まだ解決できません。
どうやら、同じ状況のようです。

解決しましたらご報告しますので、
何かお分かりになりましたら、よろしくお願いします。

>私も今リラックマさんと同じことで悩んでいまして、
>ここを参考にさせていただいてバッチファイルを作成してみたのですが、
>JP1を使ってftpでログを出力するバッチファイルを実行しても
>ログにはコードの部分が全く出力されないようです。
>バッチファイルそのものを実行すると上手くいくんですが・・・
>
>JP1を使った実行の場合のログ*************************
>User (HOSTNAME:(none)): open localhost
>
>
>
>cd /host
>put c:\Send\test.dat
>quit
>************************************************
>
>JP1を使わないで実行したの場合のログ**********************
>ftp> Connected to HOSTNAME.
>
>open localhost
>220 HOSTNAME Microsoft FTP Service (Version 5.0).
>User (HOSTNAME:(none)): 
>331 Anonymous access allowed, send identity (e-mail name) as password.
>
>230 Anonymous user logged in.
>ftp> ftp> 
>cd /host
>250 CWD command successful.
>ftp> put c:\Send\test.dat
>200 PORT command successful.
>150 Opening ASCII mode data connection for test.dat.
>226 Transfer complete.
>ftp: 1694000 bytes sent in 0.14Seconds 12014.18Kbytes/sec.
>
>ftp> quit
>221  
>************************************************
>
690.
Re:バッチでのFTP
2005年08月08日(月) 22時40分
otn
>出されるログが、
>
>cd /host
>put c:\Send\test.dat
>quit
>
>としかありません。

二人の方が同じ現象ということは、ミスや勘違いではなさそうですね。
可能性としては、別のftp.exeが動いているのかもしれないので、フルパスで、%windir%\system32\ftp.exe と書いてみるか。

それでも駄目だったらftp.exeを使うのを諦めてJP1のファイル転送機能を使うのでしょうか。
691.
Re:バッチでのFTP
2005年08月09日(火) 18時54分
KBZN
フルパス指定で実行してみましたが、結果は変わりませんでした。
JP1のファイル転送機能というのはJP1/FTPのことをおっしゃているんですよね?
私の場合、今回はJP1/FTPは導入していないのでそれは無しで考えたいのです。
やっぱり無理なんですかねぇ。。。


>
>二人の方が同じ現象ということは、ミスや勘違いではなさそうですね。
>可能性としては、別のftp.exeが動いているのかもしれないので、フルパスで、%windir%\system32\ftp.exe と書いてみるか。
>
>それでも駄目だったらftp.exeを使うのを諦めてJP1のファイル転送機能を使うのでしょうか。
692.
Re:バッチでのFTP
2005年08月10日(水) 13時19分
otn
>フルパス指定で実行してみましたが、結果は変わりませんでした。
>JP1のファイル転送機能というのはJP1/FTPのことをおっしゃているんですよね?
>私の場合、今回はJP1/FTPは導入していないのでそれは無しで考えたいのです。
>やっぱり無理なんですかねぇ。。。

JP1が何か特殊なプログラムの起動の仕方をしているのかもしれないですが、
それにしても全くリダイレクトされないならともかく、一部の出力がリダイレクトされ一部がされないというのはどうにもわかりません。
JP1の購入元の日立か代理店かに相談するのがよいかと思います。

あと、最後のあがきとして、
cmd.exe /c "%windir%\system32\ftp.exe -s:b.bat >ftp.log"
はどうでしょうか。
693.
Re:バッチでのFTP
2005年08月10日(水) 14時23分
通りすがり
私も同じ現象で悩んでいたのですが(JP1ではありませんが)
FTPファイルにサブコマンド
verbose
を指定するとうまくいきました。
試してみてはいかがでしょうか。

>>フルパス指定で実行してみましたが、結果は変わりませんでした。
>>JP1のファイル転送機能というのはJP1/FTPのことをおっしゃているんですよね?
>>私の場合、今回はJP1/FTPは導入していないのでそれは無しで考えたいのです。
>>やっぱり無理なんですかねぇ。。。
>
>JP1が何か特殊なプログラムの起動の仕方をしているのかもしれないですが、
>それにしても全くリダイレクトされないならともかく、一部の出力がリダイレクトされ一部がされないというのはどうにもわかりません。
>JP1の購入元の日立か代理店かに相談するのがよいかと思います。
>
>あと、最後のあがきとして、
>cmd.exe /c "%windir%\system32\ftp.exe -s:b.bat >ftp.log"
>はどうでしょうか。
>
696.
Re:バッチでのFTP
2005年08月12日(金) 12時05分
knzn
うまく出力されました!通りすがりの方、ありがとうございます!

otnさん

>>あと、最後のあがきとして、
>>cmd.exe /c "%windir%\system32\ftp.exe -s:b.bat >ftp.log"
>>はどうでしょうか。
>>

試してみましたが、やはり結果は前回と同じでした。
でも、色々と教えてくださってありがとうございました!

リラックマさんもきっとうまくいきますよ!

>私も同じ現象で悩んでいたのですが(JP1ではありませんが)
>FTPファイルにサブコマンド
>verbose
>を指定するとうまくいきました。
>試してみてはいかがでしょうか。
>
>>>フルパス指定で実行してみましたが、結果は変わりませんでした。
>>>JP1のファイル転送機能というのはJP1/FTPのことをおっしゃているんですよね?
>>>私の場合、今回はJP1/FTPは導入していないのでそれは無しで考えたいのです。
>>>やっぱり無理なんですかねぇ。。。
>>
>>JP1が何か特殊なプログラムの起動の仕方をしているのかもしれないですが、
>>それにしても全くリダイレクトされないならともかく、一部の出力がリダイレクトされ一部がされないというのはどうにもわかりません。
>>JP1の購入元の日立か代理店かに相談するのがよいかと思います。
>>
>>あと、最後のあがきとして、
>>cmd.exe /c "%windir%\system32\ftp.exe -s:b.bat >ftp.log"
>>はどうでしょうか。
>>
697.
Re:バッチでのFTP
2005年08月15日(月) 18時49分
りらっくま
返事が遅くなってしまい申し訳ありません!

otnさん、通りすがりさん、KBZNさん
ありがとうございます!

みなさんのアドバイスを参考に、
出力したログ内に、正常終了コードが存在しなければ、
exit /b で終了させる、という処理にしました。

WindowsXPでは無事に出力することができたのですが、
Windows2000serverで試みようとしたところ、うまく
いかなくなってしまいました。

詳しい記述内容は以下の通りです。

for /f %%A in ('findstr /b /c:"226 " c:\summit\log\dthat.log^|find /c "226"') do set OKCNT=%%A
if %OKCNT%==0 (exit /b 100 )

exit /b が機能していないようなのですが、
どなたかお分かりになる方がいらっしゃいましたら、
教えていただけないでしょうか。

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

>うまく出力されました!通りすがりの方、ありがとうございます!
>
>otnさん
>
>>>あと、最後のあがきとして、
>>>cmd.exe /c "%windir%\system32\ftp.exe -s:b.bat >ftp.log"
>>>はどうでしょうか。
>>>
>
>試してみましたが、やはり結果は前回と同じでした。
>でも、色々と教えてくださってありがとうございました!
>
>リラックマさんもきっとうまくいきますよ!
>
>>私も同じ現象で悩んでいたのですが(JP1ではありませんが)
>>FTPファイルにサブコマンド
>>verbose
>>を指定するとうまくいきました。
>>試してみてはいかがでしょうか。
>>
>>>>フルパス指定で実行してみましたが、結果は変わりませんでした。
>>>>JP1のファイル転送機能というのはJP1/FTPのことをおっしゃているんですよね?
>>>>私の場合、今回はJP1/FTPは導入していないのでそれは無しで考えたいのです。
>>>>やっぱり無理なんですかねぇ。。。
>>>
>>>JP1が何か特殊なプログラムの起動の仕方をしているのかもしれないですが、
>>>それにしても全くリダイレクトされないならともかく、一部の出力がリダイレクトされ一部がされないというのはどうにもわかりません。
>>>JP1の購入元の日立か代理店かに相談するのがよいかと思います。
>>>
>>>あと、最後のあがきとして、
>>>cmd.exe /c "%windir%\system32\ftp.exe -s:b.bat >ftp.log"
>>>はどうでしょうか。
>>>
>
>
704.
Re:バッチでのFTP
2005年08月20日(土) 16時13分
otn
>for /f %%A in ('findstr /b /c:"226 " c:\summit\log\dthat.log^|find /c "226"') do set OKCNT=%%A
>if %OKCNT%==0 (exit /b 100 )
>
>exit /b が機能していないようなのですが、

exit /b が機能していないというのはどうやって判断しましたか?
if %OKCNT%==0 (exit /b 100 )
のかわりに、無条件に
exit /b 100
と書いてみて ERRORLEVEL==100 で終了しないなら exit /b が機能していないということですが。

%OKCNT% の値が正しくセットされているか、if の前でecho & pause してみてはどうでしょうか。
831.
Re:バッチでのFTP
2005年10月27日(木) 00時42分
ああああ
ちょっと前のネタですが、参考までに。

JP1でFTPコマンド実行する場合の注意点。
[注意点]
JP1でftpコマンドを使用したジョブの実行時に、標準出力データが出力されない場合がある。

[対処方法(2つ)]
1. ftpコマンドに-vオプションを指定する。
2. ジョブ定義時に標準入力ファイル名、標準出力ファイル名、および標準エラー出力ファイル名に「CON」を指定する。

↑上記内容マニュアル内の情報です。
852.
Re:バッチでのFTP【便乗質問98版】
2005年11月26日(土) 11時46分
はいどら
お世話になります。
便乗質問させて下さい。

OSはwin95になります。

ftp送信エラー判定を下記コマンドを参考にして作成し、一旦2000上でテストしうまく行きましたがwin95で同じことをすると「構文が違います」言われてしまいます。この構文を95で稼動させるにはどこをどう直せば良いのでしょうか?

for /f %%A in ('findstr /b /c:"226 " ftp.log^|find /c "226"') do set OKCNT=%%A

if %OKCNT% lss 1 (goto NG) else goto OK 
854.
Re:バッチでのFTP【便乗質問98版】
2005年11月27日(日) 08時00分
YanaKen◆c0rnJ1Q=
はいどらさん こんにちは。

>OSはwin95になります。
>
>ftp送信エラー判定を下記コマンドを参考にして作成し、一旦2000上でテストしうまく行きましたがwin95で同じことをすると「構文が違います」言われてしまいます。この構文を95で稼動させるにはどこをどう直せば良いのでしょうか?
>
>for /f %%A in ('findstr /b /c:"226 " ftp.log^|find /c "226"') do set OKCNT=%%A
>
>if %OKCNT% lss 1 (goto NG) else goto OK 

 Windows95では、for コマンドに/fスイッチが存在しません。(タイトルで98版とお書きですが、Windows98でも以下同様です)
 findstrもNT系のみに存在するコマンドです。
 また、比較演算子 LSS もありません。
 なので、「直す」レベルで同じ処理を実現するのはむずかしいと思います。

 もう少し具体的にみると、いちばんひっかかるのは、

・FINDSTRによって、先頭が"226 "で始まる行があるかどうかを探す処理。

 ……の部分で、95/98の標準コマンドの範囲では代替手段がないと思われます。このため、

・FINDだけで処理する(行の中間にたまたま"226 "がある場合もマッチしてしまうため、処理の精度が落ちることになりますが)
・非標準の文字列処理関係のオンラインソフトの使用(↓下記サイトなどにいろいろあります)
  http://www.vector.co.jp/vpack/filearea/dos/util/text/find/index.html
 ……のいずれかの選択が必要だと思いますし、その先で「結果を取得して分岐」の部分も少々難物です。

YanaKen
855.
Re:バッチでのFTP【便乗質問98版】
2005年11月28日(月) 09時27分
はいどら
ご返答ありがとうございます。

精度は低くなるとして、findだけでもOKなのですが、find /c "226 " ftp.log では表示されるだけで、後続のロジック判断が出来ないので、変数への代入方法を教えて頂けませんでしょうか。

また、後続の条件分岐にしてもlss代わりの
分岐方法があれば教えて頂ければと存じます。

教えてばかりで申し訳ないのですが、できれば
フリーソフトは使いたくないので…。

よろしくお願い致します。
856.
Re:バッチでのFTP【便乗質問98版】
2005年11月28日(月) 11時38分
YanaKen◆c0rnJ1Q=
はいどらさん おはようございます。

>精度は低くなるとして、findだけでもOKなのですが、find /c "226 " ftp.log では表示されるだけで、後続のロジック判断が出来ないので、変数への代入方法を教えて頂けませんでしょうか。

 この点をさして「少々難物」と書きましたが、findを使うのであれば、このコマンドは「何も見つからなかった場合」にerrorlevel 1を返すようですので(手元ではWindows98で確認。Windows95では確認していません)、これを利用することができると思います。

find /c "226 " <ftp.log
if errorlevel 1 goto NG
:OK
goto END
:NG
 ......
:END

YanaKen
857.
Re:バッチでのFTP【便乗質問98版】
2005年11月28日(月) 12時46分
はいどら
やなけん様

ご返信ありがとうございます。
当方も当方なりにあーだこーだとやってみまして

rem [ ftp送信の実行結果をログデータから検証します ]
rem [ 226があった場合はエラーレベルは"0"になることから判定 ]
find /c "226 " ftp.log
set OKSIGN=%errorlevel%

rem [ OKSIGNが"0"の場合はftp成功、それ以外は失敗と判定 ]
if %OKSIGN% == 0 (goto OK) else goto NG 

こんなロジックを組んで動かしていました。
開発環境が2000なので自宅のPCでないと9598系で動くかは不明ですが…。

一応、MS-DOSプロントで使用できる構文のみを
使用したつもりですが、意味はやなけん様の言っているのと同じですよね?

色々とありがとうございます。
また、ご報告します。
858.
Re:バッチでのFTP【便乗質問98版】
2005年11月28日(月) 12時54分
YanaKen◆c0rnJ1Q=
>set OKSIGN=%errorlevel%

>使用したつもりですが、意味はやなけん様の言っているのと同じですよね?

 同じといえば同じですが、errorlevelを環境変数として参照できるのもNT系だけの機能ですのでご注意を。(つまり、そのままだと期待通りには動かないと思います)

YanaKen
859.
Re:バッチでのFTP【便乗質問98版】
2005年11月28日(月) 13時12分
otn
> 同じといえば同じですが、errorlevelを環境変数として参照できるのもNT系だけの機能ですのでご注意を。(つまり、そのままだと期待通りには動かないと思います)

2000やXPで95,98系のテストをするなら、完全ではないですが、
command /c test1.bat
のようにcommand.comで起動する方法があります。/E:nnnn オプションが必要かもしれません。
直接、command.com とだけ打つと途中でCMD.EXEに差し変わるようですが。

あと、find "226 " だけではなくその後のメッセージも含めてfindするとftpサーバーソフト依存にはなってしまいますけど精度は落ちないと思います。。
 
 


カテゴリー「FTP」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2005年08月04日 14:20に投稿されたエントリーのページです。

ひとつ前の投稿は「書き込まれた数値が条件に合致する行だけ別ファイルに出力したい」です。

次の投稿は「FOR文中のCALLがうまくいきません」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート