4

DOSコマンドプロセス内でC#コンソール実行可能ファイルを起動しました。

C#実行可能ファイルからDOSコマンドを実行できる必要があり(具体的には、変数をSETできる必要があります)、残りのDOSプロセスがそれらを参照できるように変数を永続化する必要があります。

すなわち:

DOSプロセスの開始->C#はSETコマンドを実行してUserVariableを設定します-> DOSプロセスは%UserVariable%をエコーできます

パフォーマンス上の理由により、setコマンドをdosスクリプトに書き込むことができません。実際、ファイルI/Oをまったく使用できません。

誰か助けてもらえますか?

4

6 に答える 6

4

SETXは環境変数を永続化します。これを確認してください:http ://technet.microsoft.com/es-es/library/cc755104(v = ws.10).aspx

于 2012-06-14T14:59:30.693 に答える
3

問題は、C#アプリケーション内からSETを呼び出しているという事実ではありません。Windowsプロンプトを開き、SETを呼び出してユーザー変数を設定しても、セッション中は保持されません。

CMD環境変数を表示、設定、または削除します。SETで行われた変更は、現在のCMDセッションの間のみ保持されます。

ソース

とにかく、.Netを介して直接変数を設定することをお勧めします。これを行うには、 Environment.SetEnvironmentVariableを使用できます。

于 2012-06-14T15:01:04.530 に答える
1

dosスクリプトからC#アプリを実行していて、後でスクリプトからアプリに設定された変数を使用したい場合は、C#内からそのスクリプトのコンテキストだけでそれを行う方法がわかりません。他の回答は、次のように表示されます。あなたはマシン自体のためですが、私はあなたがより永続的なスコープを持たない何かを必要としていることを感謝します。

これを回避するメタプログラミングの回避策は次のとおりです。

  • DOS FORループからC#アプリを呼び出す
  • C#アプリから、コンソールのSETコマンドに出力します
  • forループを使用してアプリの出力を実行します

DOSスクリプトの呼び出しは次のようになります。

FOR /F "tokens=* delims=" %%A IN ('MyApp.exe') DO ( 
   %%A
)

MyApp.exeからのコンソール出力は、次の形式である必要があります。

SET UserVariable1=UserValue1
SET UserVariable2=UserValue2

次に、各出力行は呼び出し元のFORループによって実行され、変数は呼び出し元のスクリプトのコンテキストに存在します。

于 2012-06-21T14:37:32.650 に答える
1

代わりに、次の.NETメソッドを使用してください。

Environment.SetEnvironmentVariable

于 2012-06-14T15:00:47.320 に答える
0

これは決して答えではありませんが、問題の性質上、この「妥協」は当面の間私たちが選択した道です。

C#アプリケーションによって作成されたバッチスクリプトを使用します。このスクリプトには、必要なすべての単純なsetコマンドが含まれており、C#アプリケーションを呼び出したCMDプロセスによって実行されます。

これは理想的な解決策ではないため、他のアイデアやコメントを自由に追加してください。

于 2012-06-15T13:54:13.827 に答える
-1

残念ながら、私が知る限り、これは少なくともWindows 7で利用できる「ソリューション」です。私は環境変数を設定して使用するさまざまな方法を試してきましたが、私の研究の結論は次のとおりです。 、変数を使用する場合は、事前にUSERキーまたはMACHINEキーに設定するか、スクリプトコマンドで設定してから、同じスクリプトでさらにテストするローカル変数にする必要があります。

私に関する限り、その列挙の3番目の要素であるProcessは本質的に役に立たない。それが役立つかもしれないと私が知る唯一の方法は、プロセスが別のプロセスを生成し、その環境を子プロセスに渡す場合です。これは、ほとんどの一般的な管理スクリプトにとってはやり過ぎです。

于 2012-08-24T01:25:03.240 に答える