DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロセス環境変数の名前が大文字で指定できない

環境/言語:[VS20005 / .NET 2.0 / Windows XP SP3]
分類:[.NET]

タイトルの通りですが、外部アプリを起動する際に環境変数を指定して起動したかったので、

ProcessStartInfo.EnvironmentVariablesにプロセス環境変数を設定して起動しました。

しかし、ProcessStartInfo.EnvironmentVariablesはStringDictionaryなので、変数の名前が小文字に変換されてしまいます。

起動するアプリケーションは変数の名前が大文字でないと実行できないので困っています。

大文字が指定できる方法や、別の方法は無いでしょうか。


よろしくお願いします。
■No24988に返信(HINATAさんの記事)
> タイトルの通りですが、外部アプリを起動する際に環境変数を指定して起動したかったので、
>
> ProcessStartInfo.EnvironmentVariablesにプロセス環境変数を設定して起動しました。
>
> しかし、ProcessStartInfo.EnvironmentVariablesはStringDictionaryなので、変数の名前が小文字に変換されてしまいます。

一瞬よくわかりませんでしたが、StringDictionary はキーを常に小文字に変換すると書いてありますね。

> 起動するアプリケーションは変数の名前が大文字でないと実行できないので困っています。
>
> 大文字が指定できる方法や、別の方法は無いでしょうか。

ただ、Windowsの環境変数は大文字と小文字の区別をしないと思いますが、どうでしょう?
本当に起動するアプリケーションが環境変数が大文字でないと実行できないでしょうか。
確認してみてください。

もし「どーーーーーーーしても大文字じゃないとダメなんス!死んだおじいちゃんの遺言で
大文字にしないと枕元に立つって言われたんです!」と言うのであれば、自分だったら
バッチファイルにして、バッチファイル側で環境変数を設定すると思います。
# それでもやっぱり大文字小文字は区別しないですけど
起動するアプリケーションはPHPを実行するものです。(php.exe)

実際に小文字で変数を渡したのですが、PHP側で渡された変数を参照するときも小文字でしか参照できません。

仕様として基本は大文字なので、このままだと多くのPHPスクリプトが動作しません。

やはり解決策はないのでしょうか。
■No24990に返信(HINATAさんの記事)
> 起動するアプリケーションはPHPを実行するものです。(php.exe)
>
> 実際に小文字で変数を渡したのですが、PHP側で渡された変数を参照するときも小文字でしか参照できません。
>
> 仕様として基本は大文字なので、このままだと多くのPHPスクリプトが動作しません。
>
> やはり解決策はないのでしょうか。

これもよくわからないのですが。
「PHP側で渡された変数を参照するときも小文字でしか参照でき」ないというのは、どういった意味ですか?
渡された環境変数を、PHPが大文字でアクセスしているために取得できない、ということでしょうか。

これは先の投稿でも書きましたが、Windowsの環境変数は大文字と小文字の区別をしないと思います。
本当にPHPから環境変数を取得できないのは大文字でアクセスしているためなのか、それともそれ以外の
何らかの原因があるのか、問題を切り分けるところから始めてみてはどうでしょう。

・Processで呼び出す方法ではなく、バッチファイル等の方法で、大文字の環境変数を定義してみて調べてみる
・PHPのファイルに変更を加えて、環境変数の取得部分を小文字にしてみる

などのテストをしてみて、本当に環境変数の大文字小文字が原因なのかを探ってみることが必要です。
そもそも「環境変数」と言っているものがWindowsの環境変数ではなく、いわゆる「CGI変数」のことかも
しれません。
もうすこし細かく調べてみてください。
本筋の回答ではありませんが、.NET Framework 2.0〜3.5SP1での状況として載せておきます。

Connectでは不具合として認識されており、Fixedになっていますが、.NET Framework 4.0で改善しているかどうかまでは未確認です。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=326163


# SetEnvironmentVariableで設定しておいて、UseShellExecute = falseにしておけば、新規プロセスに引き継がれるかな?(未確認)
■No24992に返信(Azuleanさんの記事)
> 本筋の回答ではありませんが、.NET Framework 2.0〜3.5SP1での状況として載せておきます。
>
> Connectでは不具合として認識されており、Fixedになっていますが、.NET Framework 4.0で改善しているかどうかまでは未確認です。
> https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=326163
>
>
> # SetEnvironmentVariableで設定しておいて、UseShellExecute = falseにしておけば、新規プロセスに引き継がれるかな?(未確認)

Environment.SetEnvironmentVariableで試したところPHP側でも大文字で参照できるようになりました!

MSDNにはEnvironment.SetEnvironmentVariable現在のアプリケーションと記述されていたので、

実行中のアプリにしか実行できないとばかり思っていました。

> これもよくわからないのですが。
> 「PHP側で渡された変数を参照するときも小文字でしか参照でき」ないというのは、どういった意味ですか?
> 渡された環境変数を、PHPが大文字でアクセスしているために取得できない、ということでしょうか。
>
> これは先の投稿でも書きましたが、Windowsの環境変数は大文字と小文字の区別をしないと思います。
> 本当にPHPから環境変数を取得できないのは大文字でアクセスしているためなのか、それともそれ以外の
> 何らかの原因があるのか、問題を切り分けるところから始めてみてはどうでしょう。
>
> ・Processで呼び出す方法ではなく、バッチファイル等の方法で、大文字の環境変数を定義してみて調べてみる
> ・PHPのファイルに変更を加えて、環境変数の取得部分を小文字にしてみる
>
> などのテストをしてみて、本当に環境変数の大文字小文字が原因なのかを探ってみることが必要です。
> そもそも「環境変数」と言っているものがWindowsの環境変数ではなく、いわゆる「CGI変数」のことかも
> しれません。
> もうすこし細かく調べてみてください。

 Windowsの環境変数ではなくプロセス環境変数でした。

 説明が足りかかったかもしれません;;

ぽぴ王子さん、Azuleanさん適切なアドバイスありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板