• ベストアンサー

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

よろしくお願いいたします。 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;... と表示されます。 これはバッチ実行前の値です。

noname#43815
noname#43815

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

  • ベストアンサー
  • 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

  • 環境変数の設定

    PC(WinME)にjavaの開発環境を入れようと、java入門書に付随していた CD-ROMからJDKをインストールしたのですが、MS/DOSプロンプトから 環境変数の設定の有効を確かめようとするのですがMS/DOSプロンプトで c:\WINDOWS> ↑のあとにjavacと打つと、「コマンドまたはファイル名が正しくありません」と 出てしまいます。どうしたらよいのでしょうか? c:\autoexec.batは、以下の通りです。 SET windir=C:\WINDOWS SET winbootdir=C:\WINDOWS SET COMSPEC=C:\WINDOWS\COMMAND.COM SET PROMPT=$p$g SET TEMP=C:\WINDOWS\TEMP SET TMP=C:\WINDOWS\TEMP SET PATH=C:\SDK1.3.1\bin;%PATH%(ここだけ入力しました。) わかる方いましたらよろしくお願いします。

  • 環境変数

    環境変数って何でしょうか?  アプリケーションプログラムやバッチプログラムに対して、ユーザーが設定する変数。環境変数の設定には、MS-DOSのSETコマンドを使用する。COMMAND.COM自身が利用する環境変数としては、COMSPEC、PATHがある。 とありますが意味がわかりません。 「ユーザーが設定する変数」の「変数」って? 環境変数が何なのか教えて頂けないでしょうか。 よろしくお願いします。

  • 環境変数

    JAVA初心者です。 今日、参考書を購入して勉強をはじめたところです。 プロンプトでjavacを実行しようとすると、「コマンドまたはファイル名が違います」とでてしまいます。 参考書には、「;c:\program files\java\jdk1.5.0\bin」を"PATH"に加えろとありますが、色々と調べながら加えましたが上手くいきません。 OSはwindows98です。 autoexec.batは C:\PROGRA~1\GRISOFT\AVGFRE~1\BOOTUP.EXE @ECHO OFF loadhigh c:\windows\COMMAND\nlsfunc.exe c:\windows\country.sys @SET CLASSPATH=C:\PROGRA~1\PHOTOD~1.0\ADOBEC~1 です。 どこに、どのように加えたらよいのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • システム環境変数が保存されない?

    質問させて下さい。 set Path=%Path%;C:\*** というコマンドをバッチファイルにして実行しているのですが、マイコンピュータのプロパティからシステム環境変数を確認してもセットしたはずのパスが登録されていません。再起動しても同様です。ちなみにシステムアカウントで実行しました。 上記のコマンドは一時的にセットするもので、永久保存するコマンドは別にあるのでしょうか? 宜しくお願いします。

  • Javaの環境変数設定について。

    はじめまして。OSはWindowsXPでJavaの勉強をしようと思い、「JDK 5.0 Update 16」をインストールし、環境変数の設定を行ったのですが、PATHにもともと環境変数があったのに、間違えて新しい環境変数に変更してしまいました。コマンドプロンプトで「jsvac」コマンドを打ち込んだら C:\Documents and Settings\takumi>javac 'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出ました。 環境変数を元に戻す方法はないのでしょうか? どなたかご教授お願いします。

    • ベストアンサー
    • Java
  • 環境変数PATHをスクリプトかバッチから設定する方法

    社内研修の準備のために、何台ものパソコン(Windows XPを想定)のセットアップを 行うことがありまして、 ・ZIPファイルの展開 ・展開後フォルダを特定の場所へ配置 ・環境変数JAVA_HOMEとPATHの変更 などをバッチやJavaScriptを利用して自動的に処理させようと しています。ZIPの展開と配置は解決できたのですが、 環境変数(pathなど)をスクリプトかバッチから設定できないでしょうか? JavaScript(またはVBスクリプト)で次のように記述すると、 一見うまくいったように見えるのですが、レジストリが書き換わるだけで、 再起動しないとpathが有効になりませんでした。(スクリプト実行後に開いた コマンドプロンプトで echo %path% をしても反映されていない。) <setenvion.js> var shell = WScript.CreateObject("WScript.shell"); shell.RegWrite("HKEY_CURRENT_USER\\Environment\\path", "C:\\Program Files\\Java\\jdk1.6.0_06\\bin", "REG_EXPAND_SZ"); googleで検索しても、バッチを実行するためにpathを設定しましょう、みたいな 情報しか見つからないので、質問させていただきました。 上記のスクリプトでも再起動すれば反映されるのでその点我慢すればよいのですが、 なにかよい方法をご存知の方、よろしくお願いします。

    • ベストアンサー
    • Java
  • 環境変数の再帰展開について

    環境変数の中で環境変数を使用したときに、 こちらの思ったように文字列が展開されません。 例. システム環境変数 SystemDrive=C: WORK_PATH=%SYSTEMDRIVE%\temp PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem ユーザー環境変数 PATH=%WORK_PATH%;%PATH% こんな感じでセットされている場合、 コマンドプロンプトでset PATHした場合の結果が異なります。 Vistaでは C:\temp;C:\WINDOWS~ と展開されますが、 Windows XP環境では %SYSTEMDRIVE%\temp;C:\WINDOWS~ と、 %SYSTEMDRIVE%の部分がそのままになってしまいます。 Windowsの環境変数には2種類の属性があり、 上記の環境変数を登録する際は"展開可能"属性にしました。 またレジストリの"Command Processor\EnableExtensions" も1になっていることを確認しています。 ちなみにset WORK_PATHとしたときは、 両方の環境で C:\temp と表示されることから、 環境変数の再帰展開がうまく機能していないと思われます。 XP環境でもVista環境と同じように環境変数の再帰展開をすることは可能でしょうか?

  • Javaの環境変数の設定について。

    独習Javaで環境変数の設定でつまずいて先に進めない状態です。Autoexec.batというファイルにC:\Program Files\Java\jdk1.5.0\BINというパスを追加しても再起動をかけると「パラメーターが多すぎます」というエラーが出てsafe modeでパスを消去しないといけなかったり、MS-DOSで実際にコンパイルをしようとしても「コマンドまたはファイル名が違います」というエラーが出ます。 OS:Windows98 Autoexec.batの内容は SET DOS4G=QUIET C:\PROGRA~1\NETWOR~1\MCAFEE~1\SCAN.EXE C:\ /NOBREAK /SILENT @IF ERRORLEVEL 1 PAUSE @ECHO OFF loadhigh c:\windows\COMMAND\nlsfunc.exe c:\windows\country.sys SET PATH=C:\FJUTY; REM Environment Settings For McAfee VirusScan SET PATH=%PATH%;C:\PROGRA~1\NETWOR~1\MCAFEE~1;C:\Program Files\Java\jdk1.5.0\BIN です。 どのようにしたらコンパイル、実行出来るように なるでしょうか? 最初でつまずいて先に進めないので どなたか教えて下さい。よろしくお願いします。

  • Javaの環境設定について教えてください。

    Java環境設定について教えてください。(コンパイルできません・・・・) j2sdk1.4.1をCドライブにインストールした後、 Autoexec.batをメモ帳で開き、以下のようにしました。 C:\PROGRA~1\ウイルスバ~1\VBSCAN.EXE C:\    C:\WINDOWS\COMMAND\ /NS /WIN95 @ECHO OFF PATH=C:\NECUTILS loadhigh c:\windows\COMMAND\nlsfunc.exe c:\windows\country.sys REM Environment Settings For McAfee VirusScan SET PATH=%PATH%;C:\PROGRA~1\NETWOR~1\MCAFEE~1 PATH ;C:\j2sdk1.4.1\bin;%PATH%  MS-DOSプロンプトで"set"と入力してもj2sdk1.4.1の文字が出てきませんし、コンパイルしようとすると"コマンドまたはファイル名が違います"と表示されます。ただ、既にコンパイル済みのファイルを"java ファイル名"で実行すると出来ます。 すみませんが、どのように設定すればよいのか教えていただけますか?

    • ベストアンサー
    • Java
  • バッチファイルについて

    @cmd /k 上記の内容で「a.bat」というファイル名で保存しました。 この保存したファイルをダブルクリックすると、バッチファイルが格納されてるフォルダのパスがコマンドプロンプト上に表示されます。 パス表示後に、いろいろな動作(「echo~」など)を実行したいと思っているんですが、うまくいきません。 どうやら一番上の「@~」を記述したものは、そのあとに「echo~」などを記述しても実行してくれないみたいです。 「@cmd /k」実行後に何か(「echo~」など)を実行するにはどうしたらいいですか?