トップ回答者
GetEnvironmentVariable と 環境変数の "temp\1"の違い

質問
-
こんにちは。
現在、既存のアプリがtemp フォルダに作成したファイルを読むように、新しいアプリを作成しているところです。
マシンはWin2008R2で、VS2013と.net 4.5 で開発しています。VBの例で、
Dim pathTemp As String = Environment.GetEnvironmentVariable("temp")
という命令を実行すると
C:\Users\(username)\AppData\Local\Temp
という答えが得られるのですが、実際にファイルが配置されているのはSETコマンドによると
TEMP=C:\Users\(username)\AppData\Local\Temp\1
だということになっています。
\1 については、リモートデスクトップなどで何人もが同一マシンにログインしていると数字が変わるので、タスクマネージャでいう「セッションID」に相当すると思うのですが、環境によっては\1が発生しません。以下は自分のクライアントPCでのSETの出力です。
TEMP=C:\Users\(username2)\AppData\Local\Temp
既存アプリはSETで得られる環境変数が指すテンポラリフォルダ、つまりtemp\1 などにファイルを発生させているのでこれを捕まえないと行けないのですが、.NET のAPIで、現在のセッションIDも含めた環境変数を取得するスマートな方法はないものでしょうか。
PowerShell で類似の問題に遭遇して、こちらはWMIのクエリーをもとにセッションIDを得るというサンプルを見つけて解決したのですが、ここまで大げさな方法ではなく、setコマンドを叩いて文字列を切り出すような原始的な方法でもない、本来あるべきやり方があるのではないかと思うのですが、お知恵をお貸し下さい。
よろしくお願いいたします。
回答
すべての返信
-
こんにちは、お返事ありがとうございました。
どうも条件が判らないまま解決してしまいました。昨日まで試行錯誤していた段階では、同じセッション内VS2013のデバッガーとcmdで違う答えが出ていたのですが、今日やりなおして見るとVSのデバッガーでも\1 が付いた価が返ってきてしまいました。
ゆうべ、質問投稿後に Process.GetCurrentProcess().SessionId というヒントを見つけたので、これを後ろにくっつけるようにしてみたらうまく動いたのですが、今朝になってみると、temp\1\1 というパスを生成して失敗するようになっていました…。法則性がはっきりしなくて気持ち悪いですが、佐祐理さんのコメントの通り「NETアプリでもSETコマンドと同じ値が得られる」のが正常な状態だという前提で、再発しないか様子を見てみようと思います。