質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1241閲覧

SETX がうまくいかない

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/04/10 02:13

編集2021/04/10 13:48

C:\Users\user> SETX PATH "%PATH%;my-new-path"

↑このようにすると、既存のパスが重複してしまう。

C:\Users\user> SETX PATH "my-new-path"

↑このようにすると既存のパスが消えてしまう。
なぜでしょうか?

>> 既存のパスが重複してしまう。
>どういう結果のことをそう言っていますか?

既存のパスが全て2つずつになります。

systemでコマンドを呼ぶ前に
std:coutでコマンドの内容を表示しています。
その辺りが何か悪さしてますか?

>std:coutでコマンドの内容を表示しています。
これ消しても関係ないですね。

_dupenv_s だとシステム環境変数とユーザー環境変数を全部拾ってくるみたいです。
ユーザー環境変数だけで良いのですがどうすれば良いでしょうか?

これ使えば良さそうだけど、、C# で SETX または SETX に相当する関数がわかりません。

C#

1public static string? GetEnvironmentVariable (string variable, EnvironmentVariableTarget target);

C#

1using System; 2using System.Diagnostics; 3using System.IO; 4 5namespace SetEnv 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 string sEnvPath = System.AppDomain.CurrentDomain.BaseDirectory; 12 DirectoryInfo di = new DirectoryInfo(sEnvPath); 13 // 親のディレクトリを取得する 14 DirectoryInfo diParent = di.Parent; 15 string sDllPath = diParent.FullName + "\dll;"; 16 string sPath = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User); 17 if(sPath.Contains(sDllPath)) 18 { 19 Console.WriteLine("環境設定済です。"); 20 Console.WriteLine("何かキーを押して下さい…"); 21 Console.ReadLine(); 22 return; 23 } 24 ProcessStartInfo startInfo = new ProcessStartInfo("SETX"); 25 startInfo.WindowStyle = ProcessWindowStyle.Normal; 26 if (sPath.Substring(sPath.Length - 1, 1).Equals(";")) 27 { 28 startInfo.Arguments = "Path \"" + sPath + sDllPath; 29 } 30 else 31 { 32 startInfo.Arguments = "Path \"" + sPath + ";" + sDllPath; 33 } 34 Process.Start(startInfo); 35 Console.WriteLine("環境設定が終了しました。"); 36 Console.WriteLine("何かキーを押して下さい…"); 37 Console.ReadLine(); 38 } 39 } 40}

一応、これで解決したけど、jsonやらなんやら余計なファイルが出来て好かん。
.NET 5.0 が入ってない環境だと動かない気がするし…
C++ で解決する方法があれば教えて下さい。

追記
やっぱり.NET 5.0 が入ってない環境だと動きませんでした。
それと、娘の学校のパソコンで動かそうとしたら、ウイルスの脅威とか言われて動きませんでした。
どうすれば良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/04/10 02:25

> 既存のパスが重複してしまう。 どういう結果のことをそう言っていますか?
guest

回答2

0

ベストアンサー

https://teratail.com/questions/217007

↑こちらで .NETのバージョン問題は解決しました。
なお、こちらの対処方法はモジュールパスがおかしくなるため、C++で作ったプログラムから引数としてモジュールパスを渡してやることにより全ての問題は解消しました。
ウイルスの脅威云々も解消しています。

投稿2021/04/10 23:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SETX PATH "%PATH%;my-new-path"は、
echo %PATH%で表示される物の後ろに;my-new-pathを追加した物がセットされます。

既存のパスが全て2つずつになります。

であれば、%PATH%の段階ですでにそうなっています。以前の設定で間違えたのでしょう。

SETX PATH "my-new-path"は、my-new-pathだけがセットされます。

投稿2021/04/10 02:47

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問