• ベストアンサー

バッチファイルで環境変数が設定されません

よろしくお願いいたします。 Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。 command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。 cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。 なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。 アドバイスをよろしくお願いいたします。 @echo off set foo=word path=c:\ echo %foo% echo %path% 上記バッチを実行すると word c:\ と表示されますが、set コマンドで確認すると FOO は存在しません PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;... と表示されます。 これはバッチ実行前の値です。

質問者が選んだベストアンサー

  • ベストアンサー
  • isle
  • ベストアンサー率51% (77/150)
回答No.3

#2です。 > >>あらかじめ起動しておいたcommand.comのプロンプトでバッチファイルを実行すれば期待通りになっているように思えるのですが。 > 私もその様に考えて同様の期待をしてバッチファイルを実行しました。 > しかしバッチ終了後に set コマンドで確認すると、環境変数はまったく変化していないのです。 バッチ実行前の状態なのです。 不思議ですね。 こちらではバッチファイルで変更した環境変数はプロンプトに戻っても変化したままです。 XP Pro SP2なので環境は変わらないと思いますが。 #COMSPEC環境変数でcmd.exeを指定してるとか。

noname#43815
質問者

補足

返事が大変遅くなり申し訳ございません。 システム環境変数に ComSpec C:\Windows\System32\cmd.exe の表記がありました。 これを消すと command.com で実行できるコマンドが (1) set, cd, path, prompt, リダイレクト だけになりました。 >set >set.txt は実行できます。 他のコマンドは dir, date, type, time, copy, pause などの内部コマンドと外部コマンドを含めて全て実行できません。 >type foo.bat > のように、何の変化もなくプロンプトが表示されるだけです。 また、システム環境変数に ComSpec C:\Windows\System32\cmd.exe の表記の有無にかかわらず、config.nt, autoexec.nt にも ComSpec の表記がないのですが、command.com の set コマンドで COMSPEC=C:\WINDOWS\SYSTEM32\COMMAND.COM が表示されます。 cmd.exe では ComSpec=C:\WINDOWS\system32\cmd.exe になっています。 私の環境では command.com は以前の DOS の内部コマンドを全て実行できるわけでは無いようです。 (1)以外のコマンドはシステム環境変数の ComSpec に記述されたプログラムを子プロセスとして実行させているようです。 システム環境変数の ComSpec に command.com を記述した場合ですが、 ComSpec に cmd.exe を記述していない場合とほぼ同じ振る舞いをしたのですが、XP の挙動がおかしくなりました。 フォルダを開くときに cmd.exe を使うショートカットを command.com を使うように勝手に書き換えだしました。 危なそうだったのですぐに環境を戻してしまい、あまり詳しくは調べていません。 command.com でバッチファイルによる環境変数の設定がしたかっただけなのに深みにハマってしまいました。 手に負えないので頭痛がしてきます、何がいけないんだろう。

その他の回答 (3)

  • isle
  • ベストアンサー率51% (77/150)
回答No.4

コマンドプロンプトで ComSpec=C:\WINDOWS\system32\cmd.exe で、command.comを起動すると COMSPEC=C:\WINDOWS\SYSTEM32\COMMAND.COM になるのはこちらも同じです。 後者に異なった設定がされているのではないかと思ったのです。 こちらでは補足に書かれているような不具合がまったく無いので 想像での回答しかできないのですが エクスプローラでbat拡張子に cmd.exe /c "%1" のような関連付けがされているのではないか というのを思い付きました。 そうでないとするともうお手上げですね。

noname#43815
質問者

補足

お返事ありがとうございます。 遅くなりましたことをお詫びいたします。 >エクスプローラでbat拡張子に >cmd.exe /c "%1" >のような関連付けがされているのではないか ですが、関連付けはありませんでした。 古い VAIO の Windows XP Home(SP2適用なし)でも試しましたが同じ結果でした。 完全にお手上げです。 MS-DOSプロンプトが必要なときは Microsoft Virtual PC で MS-DOS6.2 を使うようにしています。 なれた DOS 環境で快適ですが、テキストエディタでファイルの編集をする時 DOS のエディタではやはり不便ですね。 Virtual PC から Windows XP のプログラムを起動できるような仕組みがあると便利なんですが。 それでも共有フォルダでファイルの相互利用ができるので重宝しています。 それでは長い間お付き合いいただきましてありがとうございました。

  • isle
  • ベストアンサー率51% (77/150)
回答No.2

話が良く見えないのですが、バッチファイルを  command /c foo.bat のように起動して、環境変数に残らない、というのでしょうか。 だとしたらそれは仕様です。多重起動したとき親には反映されません。 コマンドプロンプトでも  cmd /c foo.bat と起動すれば環境変数を変更してもプロンプトに戻ったとき残っていません。 あらかじめ起動しておいたcommand.comのプロンプトでバッチファイルを実行すれば期待通りになっているように思えるのですが。

noname#43815
質問者

補足

御回答ありがとうございます。 >>多重起動したとき親には反映されません。 はい、このことは承知しております。 >>あらかじめ起動しておいたcommand.comのプロンプトでバッチファイルを実行すれば期待通りになっているように思えるのですが。 私もその様に考えて同様の期待をしてバッチファイルを実行しました。 しかしバッチ終了後に set コマンドで確認すると、環境変数はまったく変化していないのです。 バッチ実行前の状態なのです。 command.com のプロンプトから >foo.bat を実行させたいにもかかわらず、強制的に >cmd.exe /c foo.bat を実行しているようなものです。 ただし cmd.exe /c foo.bat を実行すると cmd.exe が子、孫と2重で起動します。 どうも command.com(msvdm.exe) は実行可能ファイルの処理を子プロセスの cmd.exe で処理する仕組みのようです。 しかたないのでバッチファイルの最後に command.com を追加して子プロセス上で作業をします。 こうすればバッチファイルでの変更を受け継いだ環境になりますので。 まことにありがとう御座いました。

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.1

環境変数の考え方が根本的に違うので無理だと思われます。 NT系列ではcommand.comは互換性のために残してあるに過ぎません。 cmd.exeはWindowsXP が提供するコマンドラインのツールですから XPの環境変数は利用できるように作られています。 command.comは純粋にMS-DOSの機能になるわけですが、 環境変数はNT系ではレジストリの管轄になり区分も増えています。 MS-DOSの環境変数は単なるDOS上の変数ですし、 そもそもレジストリという概念すらありませんから、 XPの環境変数にアクセスすること自体無理があると思います。

noname#43815
質問者

お礼

早速の御回答ありがとうございます。 その後調べてみたのですが、commando.com の本体である MS-DOS をエミュレートする ntvdm.exe のバッチファイルの実行は少々変わった方法で行っていました。 Process Explorer と File Moniter で確認したところ、ntvdm.exe 上でバッチファイルを実行させると、子プロセスとして cmd.exe を起動して、この cmd.exe がバッチファイルをオープンして実行し、バッチ処理が終わると cmd.exe が終了する、そして ntvdm.exe のプロンプトに戻るといった具合です。 これではバッチファイルで環境変数の設定ができないはずです。 子プロセスの環境変数を操作して、その子プロセスを終了しているだけですから。 ntvdm.exe は set コマンド等は実行できるのにバッチファイルは cmd.exe に任せてあるなんて思いもしませんでした。 なんとなくバッチファイルの起動時に違和感があるようには思っていましたが。 (画面がチラつく等) command.com ではバッチファイルで環境変数を操作できないことが確認できましたのであきらめます。 本当にありがとうございました。

関連するQ&A