[前の記事]« コマンドライン/バッチファイルからメールを送信する方法
[次の記事]プロンプトからは実行できるFOR文が、バッチファイル化すると動かない »

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

▲カテゴリー「TASKKILL,START…サービス/タスクの起動/終了」索引へ

バッチ処理の1行目終了前に2行目が実行されてしまう!?


735) (無題) 金井 2003/10/27(月) 13:23


お世話になります。

DOSコマンドを使用してバッチで実行させたいのですが、
1行目が終わってから2行目を実行するということは可能でしょうか?

バッチ作成例)
(1行目)C:\>dir > file.txt
(2行目)COPY C:\file.txt C:\file@

※’&&’で1行目と2行目を連結させることで、1行目が終わってから2行目を実行することができるかと思いますが、この指定をしてもうまく実行されませんでした。
指定例)
C:\>dir > file.txt && COPY C:\file.txt C:\file@

コマンドの書き方がまずかったのでしょうか?
それとも、1行目で実行するファイルのデータ量によって実行するタイミングが違ってくるのでしょうか?

ご教授お願いします。



736) Re:1行目終了前に2行目が実行されてしまう!? YanaKen 2003/10/27(月) 14:01


金井さん こんにちは。

>バッチ作成例)
>(1行目)C:\>dir > file.txt
>(2行目)COPY C:\file.txt C:\file@
 これ自体がバッチファイルの中身だとしたら、
C:\>
 の部分は不要ですね。
"C:\>"は、コマンド・プロンプトの典型的な画面の状態としてよく例示されますが、これ自体がコマンドの一部なのではなく、コマンド・プロンプト上に自動的に表示される文字です。バッチファイルに書き込む必要はありませんです。

SYSOP YanaKen



737) 1行目終了前に2行目が実行されてしまう!? 金井 2003/10/27(月) 17:48


>>バッチ作成例)
>>(1行目)C:\>dir > file.txt
>>(2行目)COPY C:\file.txt C:\file@
> これ自体がバッチファイルの中身だとしたら、
>C:\>
> の部分は不要ですね。
すみません。確かに不要でした。

バッチでは、リダイレクトした後に、そのファイルをコピーしたいのですが、データ量が多いとコピーされないみたいなのです。
’A && B’を使用すると、Aが実行された(完了)後に、Bが実行されるという認識なのですが、'&&'はこのような使い方はしないのでしょうか。

引き続きご教授お願いします。



738) Re3:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/28(火) 08:51


>’A && B’を使用すると、Aが実行された(完了)後に、Bが実行されるという認識なのですが、'&&'はこのような使い方はしないのでしょうか。

A && B は、「Aが失敗した場合はBを実行しない」ために書くと思います。

A
B

と書くと、「Aの成功失敗にかかわらずBを実行する」ということになると思います。Bの実行はAの終了の後です。

いずれも B の実行は A の終了後、というのは同じだと思います。


>バッチでは、リダイレクトした後に、そのファイルをコピーしたいのですが、データ量が多いとコピーされないみたいなのです。

これは別の要因があるのではないでしょうか。



740) Re3:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/28(火) 09:00


>それとも、1行目で実行するファイルのデータ量によって実行するタイミングが違ってくるのでしょうか?

たとえば、書き込み先がネットワークの先にあるディスクだったり、ディスクがキャッシュを持ってたりすると、書き込み側のプロセスが全データをフラッシュ したあと、次の処理を起動した時点ではまだディスク側で実際の書き込みが完了しないとか、またまだ更新されない読み込み用キャッシュから読み取ったり、な どということはありえると思います。

環境に対して、小さいデータ量から増やしながらテストしてみると動向が見えるかもしれません。




741) Re4:1行目終了前に2行目が実行されてしまう!? 金井 2003/10/28(火) 13:38


>>それとも、1行目で実行するファイルのデータ量によって実行するタイミングが違ってくるのでしょうか?

>たとえば、書き込み先がネットワークの先にあるディスクだったり、ディスクがキャッシュを持ってたりすると、書き込み側のプロセスが全データをフラッ シュしたあと、次の処理を起動した時点ではまだディスク側で実際の書き込みが完了しないとか、またまだ更新されない読み込み用キャッシュから読み取った り、などということはありえると思います。

>環境に対して、小さいデータ量から増やしながらテストしてみると動向が見えるかもしれません。


お世話になります。

ネットワーク越しに書き込みはしていませんでした。ローカルマシン内でこのバッチを実行しています。

小さいデータ量から試してみましたがある程度までは正常に実行できました。

詳しくは下記のようなバッチを作成しております。
1行目)リダイレクトを実行するAAA.exeを実行
2行目)1行目でできたファイルをコピー

大きなデータ量の時に実行するとバッチを2回実行したにも関わらずコピー先には、1回目のデータが残っているのです。
なので、1行目が終わっていないうちに2行目が走ってしまい、リダイレクト先の更新されていない1回目のファイルがコピーされたのではないかと考えました。
※1回目と2回目を実行する間隔は十分にとっています。
※また、2回目実行後にコピー先のファイルを開くまでの時間も十分に取ってあります。

ご指摘ですと、基本的に1行目のコマンドが完了していないと2行目は実行されないという認識でよいのでしょうか。
1行目はコマンドを発行しているのではなく、EXEを実行しているせいなのでしょうか。

何か解決方法等ございましたら、ご教授お願いします。

742) Re5:1行目終了前に2行目が実行されてしまう!? YanaKen 2003/10/28(火) 15:28


金井さん こんにちは。

>詳しくは下記のようなバッチを作成しております。
>1行目)リダイレクトを実行するAAA.exeを実行
>2行目)1行目でできたファイルをコピー

>ご指摘ですと、基本的に1行目のコマンドが完了していないと2行目は実行されないという認識でよいのでしょうか。
>1行目はコマンドを発行しているのではなく、EXEを実行しているせいなのでしょうか。

 実際にはDIRでの話ではなかったのですね。
 だったら最初からそう書いたほうがよかったですね。

 たとえばNOTEPAD.EXE(あくまでも一例)を起動するバッチは、(通常のやりかたでは)NOTEPAD(メモ帳)の終了を待たずに先に進みま す。これを避けるには START /WAIT NOTEPAD.EXE のようなコマンド書式があります。(詳細は START /? でヘルプ参照)

 一方、DIRとかXCOPYのような(XCOPYも.EXEファイルですが)シングルタスク系のコマンド/プログラム(正式にはなんというのか知りません(^^;)では、(逆にSTARTコマンドで別プロセス化しない限り)そういうことは起きない……と、少なくともぼくは認識してます。

 なので最初の質問(DIRが前提)では、「実行しているそのバッチ処理の中の、どこか他の要素に起因している可能性(たとえば文法の誤り)」のほうが疑わしく見えたわけです。

SYSOP YanaKen


743) Re6:1行目終了前に2行目が実行されてしまう!? 金井 2003/10/28(火) 16:15


> 実際にはDIRでの話ではなかったのですね。
> だったら最初からそう書いたほうがよかったですね。

> たとえばNOTEPAD.EXE(あくまでも一例)を起動するバッチは、(通常のやりかたでは)NOTEPAD(メモ帳)の終了を待たずに先に進みま す。これを避けるには START /WAIT NOTEPAD.EXE のようなコマンド書式があります。(詳細は START /? でヘルプ参照)

> 一方、DIRとかXCOPYのような(XCOPYも.EXEファイルですが)シングルタスク系のコマンド/プログラム(正式にはなんというのか知りま せん(^^;)では、(逆にSTARTコマンドで別プロセス化しない限り)そういうことは起きない……と、少なくともぼくは認識してます。

> なので最初の質問(DIRが前提)では、「実行しているそのバッチ処理の中の、どこか他の要素に起因している可能性(たとえば文法の誤り)」のほうが疑わしく見えたわけです。


お世話になります。

すみません。
分かりやすくしようとして、EXEを実行するという重要な情報が欠けていました。

では、前の行が終了したら次の行を実行するという時、
バッチファイルは下記のような書き方でよろしいでしょうか?
1行目)START /WAIT C:\BATCH\TEST.exe
2行目)START /WAIT TEST.exeで作成されたファイルFILE.txtをFILE@.txtにコピー
3行目)C:\BATCH\END.exe

745) Re7:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/28(火) 16:26


>1行目)START /WAIT C:\BATCH\TEST.exe
>2行目)START /WAIT TEST.exeで作成されたファイルFILE.txtをFILE@.txtにコピー
>3行目)C:\BATCH\END.exe

うーん。「リダイレクトを実行する」というのはどう理解すればよいでしょう?


746) Re7:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/28(火) 16:31


>1行目)START /WAIT C:\BATCH\TEST.exe
>2行目)START /WAIT TEST.exeで作成されたファイルFILE.txtをFILE@.txtにコピー
>3行目)C:\BATCH\END.exe

すくなくとも、2行目が DOS の COPY コマンドなら、2行目の START 文は不要だと思います。




744) Re5:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/28(火) 16:24


> 1行目)リダイレクトを実行するAAA.exeを実行
> 2行目)1行目でできたファイルをコピー

「リダイレクトを実行するAAA.exe」っていうのがわかりません。

AAA.exe > ファイル

と書いているという意味でしょうか?

処理が非同期になっているということは、親側が wait せずに子プロセスを起動しているんですかね。その場合に親側起動時のリダイレクトって、親プロセスが終了しても子プロセスからの標準出力を最後まで受け取ってくれるものなんでしょうか?

親プロセスの標準出力と子プロセスの標準出力をごっちゃにリダイレクトしている、というちょっと怪しい関係だとすると、私にはよくわかりません。

また、この AAA.exe がどのように子プロセスやらスレッドやらをあやつるシロモノなのかによっては、START /WAIT のようなコマンド書式でも必ずしもカバーしえないような気がします。


>何か解決方法等ございましたら、ご教授お願いします。

非同期になっているわけですから、何らかの手段で同期をとるようにするということでしょうね。その AAA.exe というのが自作のものならば、改造して、きちんと引数に出力ファイル名を受け取ってそのファイルへ出力し、さらに終了時にその出力が終了したことを示す別 のファイル(終了ファイル)を作成して終了、とかするようにして、バッチ処理側では、sleep(DOS標準コマンドにはない、WSHでは書けたような気 が) をかませてその終了ファイルができるのをリトライしつつ確認するようなループに入るようにして(atコマンドでもいいかも)、終了ファイルができたら処理 を続行する、また規定時間ないし規定回数のリピート内に終了ファイルができなかったらエラー処理をする(無限ループにさせないため)、とかするしかないの では。



747) Re6:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/28(火) 16:40


>非同期になっているわけですから、何らかの手段で同期をとるように するということでしょうね。その AAA.exe というのが自作のものならば、改造して、きちんと引数に出力ファイル名を受け取ってそのファイルへ出力し、さらに終了時にその出力が終了したことを示す別 のファイル(終了ファイル)を作成して終了、とかするようにして、


この AAA.exe が引数を2つとって、最初から自分の中でコピーを作成するようにすればなお簡単かも。

AAA.exe に手を加えられないとすると... うまくいく回避策を見出すべくいろいろ試すしかないのではないかと...

START /wait でうまく行かない場合のイメージですが、例えば

STAR /wait hidemaru

で秀丸エディタを起動して、そこから「新規作成」でもう1つ秀丸のウィンドウを起動して、最初のウィンドウを閉じる、と、2個目の秀丸は生きているものの、上記の START /wait は終了します。

内部のプロセス起動がこんなような関係になっていたら、START /wait ではうまくうかないと思います。




748) Re5:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/29(水) 14:14


>詳しくは下記のようなバッチを作成しております。
>1行目)リダイレクトを実行するAAA.exeを実行
>2行目)1行目でできたファイルをコピー
>大きなデータ量の時に実行するとバッチを2回実行したにも関わらずコピー先には、1回目のデータが残っているのです。
>なので、1行目が終わっていないうちに2行目が走ってしまい、リダイレクト先の更新されていない1回目のファイルがコピーされたのではないかと考えました。
>※1回目と2回目を実行する間隔は十分にとっています。
>※また、2回目実行後にコピー先のファイルを開くまでの時間も十分に取ってあります。

再度このくだりをよく読むと。「バッチを2回実行したにもかかわらずコピー先には1回目のデータが残っている」となっていますね。中途半端なファイルが取れるというわけではないようですね。

「リダイレクトを実行する AAA.exe」という部分が私にはよくわからないのですが、もし

コマンド > ファイル

のようなコマンドライン上の標準出力のリダイレクトでファイル出力をしているならば、コマンドの実行に先立ってリダイレクト先のファイルは初期化され空に なった状態で書き込みオープンされると思うので、リダイレクト先が同じファイル名であり、毎回のコマンド実行ないしリダイレクトが成功しているのであれ ば、2回実行した後に1回目のデータが拾えるようなことはないと思います。またコマンドの実行に失敗していても空のファイルができるので、1回目のファイ ルが拾えるような状況にはならなそうな気がします。

何らかの理由で「2回目の実行」においても1回目と同じファイルを出力していたりしないのでしょうか?

いずれにしても、まずは手打ちでコマンドを実行しつつ、少しづつ状況を切り分けていくしかない、と思います。



753) Re6:1行目終了前に2行目が実行されてしまう!? eight 2003/10/30(木) 10:22


eightと申します。
便乗質問で申し訳ありませんが、私も同じような内容で困っております。
バッチとしては、以下の内容になります。
copy a.txt b.txt
start hoge.exe
一行目のcopy処理が終了が完了してから二行目のexeを起動したいのですが、copyが完了するより先にexeが起動してしまいます。
※b.txtにコピーされていないとexeがエラーになります。
&&で一行目と二行目を連結させてもダメでした。
どなたかのお知恵を拝借できれば幸いです。
なお、copyするファイルは50KB程度のサイズです。

>>詳しくは下記のようなバッチを作成しております。
>>1行目)リダイレクトを実行するAAA.exeを実行
>>2行目)1行目でできたファイルをコピー
>>大きなデータ量の時に実行するとバッチを2回実行したにも関わらずコピー先には、1回目のデータが残っているのです。
>>なので、1行目が終わっていないうちに2行目が走ってしまい、リダイレクト先の更新されていない1回目のファイルがコピーされたのではないかと考えました。
>>※1回目と2回目を実行する間隔は十分にとっています。
>>※また、2回目実行後にコピー先のファイルを開くまでの時間も十分に取ってあります。

>再度このくだりをよく読むと。「バッチを2回実行したにもかかわらずコピー先には1回目のデータが残っている」となっていますね。中途半端なファイルが取れるというわけではないようですね。

>「リダイレクトを実行する AAA.exe」という部分が私にはよくわからないのですが、もし

>コマンド > ファイル

>のようなコマンドライン上の標準出力のリダイレクトでファイル出力をしているならば、コマンドの実行に先立ってリダイレクト先のファイルは初期化され空 になった状態で書き込みオープンされると思うので、リダイレクト先が同じファイル名であり、毎回のコマンド実行ないしリダイレクトが成功しているのであれ ば、2回実行した後に1回目のデータが拾えるようなことはないと思います。またコマンドの実行に失敗していても空のファイルができるので、1回目のファイ ルが拾えるような状況にはならなそうな気がします。

>何らかの理由で「2回目の実行」においても1回目と同じファイルを出力していたりしないのでしょうか?

>いずれにしても、まずは手打ちでコマンドを実行しつつ、少しづつ状況を切り分けていくしかない、と思います。





754) Re7:1行目終了前に2行目が実行されてしまう!? ふぇむ 2003/10/30(木) 12:29


> copy a.txt b.txt
> start hoge.exe
>一行目のcopy処理が終了が完了してから二行目のexeを起動したいのですが、copyが完了するより先にexeが起動してしまいます。

なんなんでしょうね。
マルチCPUだったりするとパラでコマンド実行されたりするとか?
ディスクの書き込みキャッシュが関係しているとか?

COPY コマンドには /V ベリファイオプションがあるようです。使ったことはありませんが、これをつけると確実に COPY コマンド内で書き込んだファイルを再度読み出してチェックしてくれるんではないでしょうか。これが成功する場合は、ファイルのコピーは正常に終わっている のではないでしょうか。

/V 新しいファイルが正しく書き込まれたか検査します。
  • ◆735.  (無題) (金井)   2003/10/27(月) 13:23
    •  736.  Re:1行目終了前に2行目が実行されてしまう!? (YanaKen)   2003/10/27(月) 14:01
      •  737.  1行目終了前に2行目が実行されてしまう!? (金井)   2003/10/27(月) 17:48
        •  738.  Re3:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/28(火) 08:51
        •  740.  Re3:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/28(火) 09:00
          •  741.  Re4:1行目終了前に2行目が実行されてしまう!? (金井)   2003/10/28(火) 13:38
            •  742.  Re5:1行目終了前に2行目が実行されてしまう!? (YanaKen)   2003/10/28(火) 15:28
              •  743.  Re6:1行目終了前に2行目が実行されてしまう!? (金井)   2003/10/28(火) 16:15
                •  745.  Re7:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/28(火) 16:26
                •  746.  Re7:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/28(火) 16:31
            •  744.  Re5:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/28(火) 16:24
              •  747.  Re6:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/28(火) 16:40
            •  748.  Re5:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/29(水) 14:14
              •  753.  Re6:1行目終了前に2行目が実行されてしまう!? (eight)   2003/10/30(木) 10:22
                •  754.  Re7:1行目終了前に2行目が実行されてしまう!? (ふぇむ)   2003/10/30(木) 12:29
 
 


カテゴリー「TASKKILL,START…サービス/タスクの起動/終了」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2003年10月27日 23:53に投稿されたエントリーのページです。

ひとつ前の投稿は「コマンドライン/バッチファイルからメールを送信する方法」です。

次の投稿は「プロンプトからは実行できるFOR文が、バッチファイル化すると動かない」です。

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

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