[前の記事]« バッチファイルの定期実行
[次の記事]ファイル名に日付を追加してデータを待避するには? »

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

▲カテゴリー「CALL,GOTO」索引へ
▲カテゴリー「リダイレクト(> <)、パイプ( | )、その他の特殊記号」索引へ

callのパイプ処理で環境変数への代入が消滅してしまう

18) DOS窓の環境変数とパイプの関係 だうらんど 2002/02/25(月) 16:19


始めまして。だうらんどと申します。
ちょっと説明しにくいのですが、DOS窓の環境変数とパイプの関係で悩んでいます。環境は、WinNT4.0 SP6です。
例えば、次の様な、二つのバッチファイルを作成します。

*--- test1.bat ---*
@echo off
set aaa=0
echo %aaa%
echo.
call TEST2
echo.
echo %aaa%

*--- test2.bat ---*
@echo off
SET aaa=1
echo 2222
echo %aaa%
echo 3333

test1.batを実行すると、DOS窓の表示は次のようになります。

0

2222
1
3333

1

ここで、test1.batでtest2.batをcallしている行を、
call TEST2 | sort
と変えて実行すると、そのDOS窓の表示は

0

1
2222
3333

0

となり、最後のaaaの値が0になってしまいます。
パイプを入れた事で、test2.batで行われているaaaへの代入が、test1.batに戻った時点で無視されているようなのですが、これを防ぐ方法はあるのでしょうか。よろしくお願いいたします。


20) Re:DOS窓の環境変数とパイプの関係 SYSOP YanaKen 2002/02/26(火) 00:08


だうらんどさん こんにちは。

》ちょっと説明しにくいのですが、
 確かにわかりにくかったです(^^;。途中にsortコマンドが出てくるぶん話がなおさらややこしくなってますが、核心はパイプ処理の仕様であって、呼ばれるのがsortコマンドであることは本質ではないようなので、ぼくなりにもっと一般化したサンプルを考えてみました。

:mother.bat
@set aaa=●
@echo 現在、環境変数aaaは"%aaa%"です。
@call child.bat
@echo 現在、環境変数aaaは"%aaa%"です。
:child.bat
@SET aaa=◎
@echo %0 は環境変数aaaを "%aaa%" にセットしました。

《実行結果》
>> 現在、環境変数aaaは"●"です。
>> child.bat は環境変数aaaを "◎" にセットしました。
>> 現在、環境変数aaaは"◎"です。

⇒さてここでmother.batの3行めにパイプ処理を入れ、@call child.bat | more としてみると、

>> 現在、環境変数aaaは"●"です。
>> child.bat は環境変数aaaを "◎" にセットしました。
>> (1行改行が発生)
>> 現在、環境変数aaaは"●"です。

 ……と、確かに環境変数は元に戻ってしまいます。(Windows2000で確認)
 この現象はしかし、callが存在しなかった時期からDOSを使ってた人間にはおなじみでして(^^;、かつてバッチファイルからバッチファイルを呼び出すには"command /c コマンド..."の書式が常道でした。で、この場合、呼ばれた子プロセスで変更された環境変数は、元のバッチファイルではきれいさっぱり消えるのが普通でした。
 そういうわけで、パイプ処理が指定されると、実際の処理としては、
 command /c call child.bat
 ……みたいに、いったん子プロセスが呼び出される状況が起きるのだと思われます。

 と、前置きが長くなりましたが、そんなわけで、直接にこの現象を起こさせなくすることは無理っぽいですが、実践的な解決方法としては「要はパイプを使わなければよい」わけで、次のように、処理を2つに分けるやりかたが考えられると思います。

@call child.bat >temp.txt
@sort <temp.txt

YanaKen


22) Re2:DOS窓の環境変数とパイプの関係 だうらんど 2002/02/26(火) 20:14


Yanakenさん、ありがとうございます。
私の、わかりにくい説明を解説までしていただいて!

>この現象はしかし、callが存在しなかった時期からDOSを使ってた人間にはおなじみでして(^^;、

そのような由来(?)があるんですね・・・。

>そんなわけで、直接にこの現象を起こさせなくすることは無理っぽいですが、実践的な解決方法としては「要はパイプを使わなければよい」わけで、次のように、処理を2つに分けるやりかたが考えられると思います。

うーん、そうなんですね。どうもUNIXをかじっていた人間には、納得し辛いところなのですが、「それがDOS窓だ!」と思うしかないのでしょうね。

ありがとうございました。
 
 


カテゴリー「CALL,GOTO」索引へ
カテゴリー「リダイレクト(> <)、パイプ( | )、その他の特殊記号」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2002年02月25日 18:41に投稿されたエントリーのページです。

ひとつ前の投稿は「バッチファイルの定期実行」です。

次の投稿は「ファイル名に日付を追加してデータを待避するには?」です。

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

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