[前の記事]« [NT系]複数ディレクトリ内のファイルをバッチで一括削除したいが、ワイルドカードを使うとエラーが発生する
[次の記事]FOR文でワイルドカードを用いた変数を2つ使うには »

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

▲カテゴリー「CALL,GOTO」索引へ

別のバッチファイルの呼び出しがうまくいかない


780) STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 kanai 2003/11/05(水) 13:10

http://bbso1.nifty.com/nbbin/nb_wrent/fpcu_bbso-0034621/wr_page=2/wr_type=C

お世話になります。
先日も質問させていただいたのですが、
下記のように実行した場合、2行目部分でDOS画面が表示されて、何か入力しないと処理が次に進みません。(今は、Exitを入れています。)

1行目)START /wait C:\test\sample.exe
2行目)START /wait C:\bat\batch_a.bat
3行目)COPY C:\out\samp_file.txt C:\out\new_file.txt
4行目)C:\test\end.exe

3行目のコピーするファイルは、1行目と2行目から作成されるファイルなので、1行目・2行目が終わってから実行するため、STARTコマンドを使用しています。
START /waitコマンドを使用する際にバッチを起動すると、何か応答が必要なのでしょうか。
2行目のバッチ内の最後に"Exit"を付加してみましたが、だめでした。

ご教授お願いします。



800) Re:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 kanai 2003/11/06(木) 15:46


お世話になります。
バッチからバッチを起動する場合は、CALLコマンドを使用するとよいということは分かりました。

バッチファイルの例)
1行目)START /wait C:\test\sample.exe
2行目)CALL C:\bat\batch_a.bat
3行目)COPY C:\out\samp_file.txt C:\out\new_file.txt
4行目)C:\test\end.exe

しかし、CALLコマンドを使用すると、START /waitは使用できなくなってしまいます。
先に3行目のコピー文が走ってしまうみたいなのですが、CALLでバッチを起動する際に、START /waitと同じように使用できるものはありますでしょうか。

2行目部分に
CALL START /wait /B C:\bat\batch_a.bat
を指定してもうまくいきませんでした。


801) Re2:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 じゃく 2003/11/06(木) 15:52


>バッチファイルの例)
>1行目)START /wait C:\test\sample.exe
>2行目)CALL C:\bat\batch_a.bat
>3行目)COPY C:\out\samp_file.txt C:\out\new_file.txt
>4行目)C:\test\end.exe

>しかし、CALLコマンドを使用すると、START /waitは使用できなくなってしまいます。
>先に3行目のコピー文が走ってしまうみたいなのですが、CALLでバッチを起動する際に、START /waitと同じように使用できるものはありますでしょうか。

直接の回答ではないのですが、
2行目に当たる部分に、batch_a.bat の中身をすべてコピーして記述してしまえば解決するのでは?


802) Re3:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 kanai 2003/11/06(木) 16:01


>>バッチファイルの例)
>>1行目)START /wait C:\test\sample.exe
>>2行目)CALL C:\bat\batch_a.bat
>>3行目)COPY C:\out\samp_file.txt C:\out\new_file.txt
>>4行目)C:\test\end.exe
>>
>>しかし、CALLコマンドを使用すると、START /waitは使用できなくなってしまいます。
>>先に3行目のコピー文が走ってしまうみたいなのですが、CALLでバッチを起動する際に、START /waitと同じように使用できるものはありますでしょうか。
>>
>直接の回答ではないのですが、
>2行目に当たる部分に、batch_a.bat の中身をすべてコピーして記述してしまえば解決するのでは?


お世話になります。
これは、バッチではなく、batch_a.bat の中身をこのバッチファイルに直接書き込むということでしょうか?

違っていましたら、すみません。

基本的に2行目の部分(バッチを起動する)は変更
なしでできる方法を探っております。

ご教授お願いします。

804) Re2:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 17:01


>しかし、CALLコマンドを使用すると、START /waitは使用できなくなってしまいます。
>先に3行目のコピー文が走ってしまうみたいなのですが、CALLでバッチを起動する際に、START /waitと同じように使用できるものはありますでしょうか。

>2行目部分に
>CALL START /wait /B C:\bat\batch_a.bat
>を指定してもうまくいきませんでした。


CALL と START は別物ですよ。
CALL では別のバッチスクリプトを自プロセス内で「コールする」だけで、プロセスは増えない(自プロセス内での実行)が、STARTは「各種実行プログラムを別プロセスを起動する」ものだ、と思います。

START でバッチを起動するなら、 cmd.exe が実行ファイルでスクリプトファイル名をオプション+引数にするんだと思います。ただしこの場合、STARTによる実行は別プロセスで行なわれるので基本 的に独立です。例えばそのバッチコマンド内で例えば set 文などで環境変数をセットしてもそれはもとのプロセスに影響を与えない、と思います。


>1行目)START /wait C:\test\sample.exe
>2行目)CALL C:\bat\batch_a.bat
>3行目)COPY C:\out\samp_file.txt C:\out\new_file.txt

これで、「2行目が終わらないうちに3行目に行く」というのは、もしかするとこの2行目のバッチコマンドって、中で別の実行プログラムを起動してたりしません? 特に win32アプリで、ウィンドウが立ち上がるような。もしくは、wait せずに別のプロセスを立ち上げるような。そうだとすると、このままではどうがんばってもバッチコマンドだけでは同期はとれないと思いますが...

もしそうなら、同期をとるためには2行目のバッチの中を書き換えて、別の実行プログラムをコールする部分を start /wait にする、とかが必要では(それでも、上記後者のような場合だと同期が取れないと思いますが)。




805) Re3:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 kanai 2003/11/06(木) 17:10


>CALL と START は別物ですよ。
>CALL では別のバッチスクリプトを自プロセス内で「コールする」だけで、プロセスは増えない(自プロセス内での実行)が、STARTは「各種実行プログラムを別プロセスを起動する」ものだ、と思います。

>START でバッチを起動するなら、 cmd.exe が実行ファイルでスクリプトファイル名をオプション+引数にするんだと思います。ただしこの場合、STARTによる実行は別プロセスで行なわれるので基本 的に独立です。例えばそのバッチコマンド内で例えば set 文などで環境変数をセットしてもそれはもとのプロセスに影響を与えない、と思います。


>>1行目)START /wait C:\test\sample.exe
>>2行目)CALL C:\bat\batch_a.bat
>>3行目)COPY C:\out\samp_file.txt C:\out\new_file.txt

>これで、「2行目が終わらないうちに3行目に行く」というのは、もしかするとこの2行目のバッチコマンドって、中で別の実行プログラムを起動してたりし ません? 特に win32アプリで、ウィンドウが立ち上がるような。もしくは、wait せずに別のプロセスを立ち上げるような。そうだとすると、このままではどうがんばってもバッチコマンドだけでは同期はとれないと思いますが...


お世話になります。

ご教授ありがとうございます。

バッチファイル内では、Copy文しか実行しておりません。

では、逆にこのバッチファイルの書き方には、特に問題はないということでしょうか。

Callコマンドを使用した場合、バッチを呼び出した時点で次の行が実行されるのではなく、呼び出したバッチが終了して次の行が実行されるという認識でよいでしょうか。

807) Re4:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 17:18


>バッチファイル内では、Copy文しか実行しておりません。
>では、逆にこのバッチファイルの書き方には、特に問題はないということでしょうか。
>Callコマンドを使用した場合、バッチを呼び出した時点で次の行が実行されるのではなく、呼び出したバッチが終了して次の行が実行されるという認識でよいでしょうか。

うーん。私はそう思いますけれど...
もっと専門家の方がコメントされればよいのですが。

なにか、CPUやBIOS等のレベルの違いとか(αチップとか?)(ハイパースレッディングテクノロジとか?)、OSそのものや環境設定上の違いとか、ま た何かレジストリ等をいじることなどで、 call や copy が平行実行されたりするようになるのかもしれませんが、私はわかりません。




808) Re5:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 17:28


>>Callコマンドを使用した場合、バッチを呼び出した時点で次の行が実行されるのではなく、呼び出したバッチが終了して次の行が実行されるという認識でよいでしょうか。

たとえば。以下のような2つのバッチスクリプトを作って、test1.cmd を実行すると、私の環境ではこうなります。


-- これは test1 です。
---- これは test1 です。
------ これは test1 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
-------- これは test1 です。
---------- これは test1 です。
------------ これは test1 です。
この変数は TEST2 で設定されました。



-----------------------
●test1.cmd

@echo off
set THIS_SET=この変数は TEST1 で設定されました。

echo -- これは test1 です。
echo ---- これは test1 です。
echo ------ これは test1 です。

call test2.cmd

echo -------- これは test1 です。
echo ---------- これは test1 です。
echo ------------ これは test1 です。

echo %THIS_SET%



-----------------------
●test2.cmd

@echo off
set THIS_SET=この変数は TEST2 で設定されました。

echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。



809) Re6:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 17:37


>>>Callコマンドを使用した場合、バッチを呼び出した時点で次の行が実行されるのではなく、呼び出したバッチが終了して次の行が実行されるという認識でよいでしょうか。

>たとえば。以下のような2つのバッチスクリプトを作って、test1.cmd を実行すると、私の環境ではこうなります。



ほぼ同様ですが、 下記のように start で起動するようにすると、次のようになりました。



■1回目

C:\tmp>test1-bystart
-- これは test1 です。
---- これは test1 です。
------ これは test1 です。
-------- これは test1 です。
---------- これは test1 です。
------------ これは test1 です。
この変数は TEST1 で設定されました。
C:\tmp>////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。


■2回目

C:\tmp>test1-bystart
-- これは test1 です。
---- これは test1 です。
------ これは test1 です。
-------- これは test1 です。
---------- これは test1 です。
------------ これは test1 です。
この変数は TEST1 で設定されました。
////// これはtest2 です。
////// これはtest2 です。
C:\tmp>////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。



C:\tmp>test1-bystart
-- これは test1 です。
---- これは test1 です。
------ これは test1 です。
-------- これは test1 です。
---------- これは test1 です。
------------ これは test1 です。
この変数は TEST1 で設定されました。
////// これはtest2 です。
C:\tmp>////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。



■3回目

test1-bystart
-- これは test1 です。
---- これは test1 です。
------ これは test1 です。
-------- これは test1 です。
---------- これは test1 です。
------------ これは test1 です。
この変数は TEST1 で設定されました。
C:\tmp>////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。
////// これはtest2 です。


------------------
●test1-bystart.cmd

@echo off
set THIS_SET=この変数は TEST1 で設定されました。

echo -- これは test1 です。
echo ---- これは test1 です。
echo ------ これは test1 です。

start /wait /b cmd.exe /k test2-with_exit.cmd

echo -------- これは test1 です。
echo ---------- これは test1 です。
echo ------------ これは test1 です。

echo %THIS_SET%



------------------
●test2-with_exit.cmd

@echo off
set THIS_SET=この変数は TEST2 で設定されました。

echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。
echo ////// これはtest2 です。

exit 0



810) Re7:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 17:38


あ、/c にすれば exit 0 を入れる必要はなかったかも?

まあ小さいことですが一応。


811) Re4:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 17:54


>バッチファイル内では、Copy文しか実行しておりません。

もう1つの可能性としては、コマンドサーチパス上に別の copy コマンドがあるとか?

以下コマンドラインで実行してひっかかれば、そういうものがあるということになると思いますが、いかがでしょうか。


for %x in ( copy.exe copy.cmd copy.bat copy.com ) do @if NOT x%~$PATH:x == x @echo %x is %~$PATH:x



813) Re5:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 kanai 2003/11/06(木) 18:45


>>バッチファイル内では、Copy文しか実行しておりません。

>もう1つの可能性としては、コマンドサーチパス上に別の copy コマンドがあるとか?

>以下コマンドラインで実行してひっかかれば、そういうものがあるということになると思いますが、いかがでしょうか。


>for %x in ( copy.exe copy.cmd copy.bat copy.com ) do @if NOT x%~$PATH:x == x @echo %x is %~$PATH:x




お世話になります。
コマンドサーチパスとは、調べてみたところ
「コマンドサーチパスとは、実行するコマンドのあり場所として、ここに書かれているフォルダを探しなさい、という意味である。」
ということですが、バッチを実行するパスということでよいのでしょうか。

何も知らなくてすみません。。。

Copyコマンドをバッチで実行するのは、コピーするファイルが
毎回違うためです。
2行目のバッチで行っているのは、
2行目バッチファイル内の例)
Copy C:\test\test001.txt C:\out\test.txt
このような簡単な文を実行しているだけなのですが。

test001.txtのデータ量が小さいとうまくいってるみたいなのですが、データ量が多くなると、失敗することが多くなります。

先ほど、ご指摘のとおり、バッチファイル以外の部分で調査をしております。ディスクの空き容量やデフラグをしてやってみようとしているところです。



816) Re6:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 ふぇむ 2003/11/06(木) 19:05


>コマンドサーチパスとは、調べてみたところ
>「コマンドサーチパスとは、実行するコマンドのあり場所として、ここに書かれているフォルダを探しなさい、という意味である。」
>ということですが、バッチを実行するパスということでよいのでしょうか。

例えば、aaa.exe というモジュールを起動したいとき、コマンドラインで aaa と打ったら、環境変数 PATH の中に列挙されたディレクトリの中のどこかに、aaa.exe があると、それが起動されます。もし PATH で指定された上に aaa.exe がなかったら、c:\なんちゃら\かんちゃら\....\aaa.exe とファイルとしての所在を明示しなければ、aaa.exe は起動できません。

ところが、aaa.exe が実は2つあって、または aaa.cmd とか aaa.bat とか、とにかく aaa で起動されそうな別の実行ファイルが、別途 PATH のなかでより最初の方にかかれたディレクトリ内にあったりすると、そっちが実行されてしまいます。

今の場合、後者を懸念した(つまり別の copy コマンドがあったりしないか?)ということです。

先ほどのコマンドをたたいた結果でわかると思います。
  • ◆780.  STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (kanai)   2003/11/05(水) 13:10
    •  800.  Re:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (kanai)   2003/11/06(木) 15:46
      •  801.  Re2:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (じゃく)   2003/11/06(木) 15:52
        •  802.  Re3:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (kanai)   2003/11/06(木) 16:01
      •  804.  Re2:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 17:01
        •  805.  Re3:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (kanai)   2003/11/06(木) 17:10
          •  807.  Re4:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 17:18
            •  808.  Re5:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 17:28
              •  809.  Re6:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 17:37
                •  810.  Re7:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 17:38
          •  811.  Re4:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 17:54
            •  813.  Re5:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (kanai)   2003/11/06(木) 18:45
              •  816.  Re6:STARTコマンドでバッチを呼び出す時に、DOSの画面が表示されてしまう。 (ふぇむ)   2003/11/06(木) 19:05
 
 


カテゴリー「CALL,GOTO」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2003年11月05日 19:06に投稿されたエントリーのページです。

ひとつ前の投稿は「[NT系]複数ディレクトリ内のファイルをバッチで一括削除したいが、ワイルドカードを使うとエラーが発生する」です。

次の投稿は「FOR文でワイルドカードを用いた変数を2つ使うには」です。

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

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