如何从C#执行DOS SET命令并在exe关闭后保持变量?

时间:2012-06-14 14:57:01

标签: c# set dos process.start

我在DOS命令进程中启动了一个C#控制台可执行文件。

我需要能够从C#可执行文件中执行DOS命令(特别是我需要能够设置变量)并使变量保持不变,以便DOS进程的其余部分可以引用它们。

即:

启动DOS进程   - > C#执行SET命令来设置UserVariable   - > DOS进程可以ECHO%UserVariable%

由于性能原因,我无法将set命令写入dos脚本。实际上,我根本没有任何文件I / O.

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:4)

SETX持久化环境变量。检查一下:http://technet.microsoft.com/es-es/library/cc755104(v=ws.10).aspx

答案 1 :(得分:3)

问题不在于您是在C#应用程序中调用SET。即使您打开Windows提示符并调用SET来设置用户变量,它也不会在会话中持续存在。

  

显示,设置或删除CMD环境变量。改变了   SET将仅保留当前CMD会话的持续时间。

Source

我建议你直接通过.Net设置变量。您可以使用Environment.SetEnvironmentVariable执行此操作。

答案 2 :(得分:1)

请改用以下.NET方法:

Environment.SetEnvironmentVariable

答案 3 :(得分:1)

如果您正在从dos脚本运行C#应用程序并希望之后从脚本中使用应用程序中设置的变量,我不知道如何在C#中为该脚本的上下文执行此操作,另一个这里的答案向您展示了机器本身,但我感谢您需要一些不太长久的东西。

元编程解决方法可以是:

  • 从DOS FOR循环中调用C#应用程序
  • 从C#app,输出到控制台SET命令
  • 使用for循环执行app output

调用DOS脚本如下所示:

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

MyApp.exe的控制台输出需要采用以下格式:

SET UserVariable1=UserValue1
SET UserVariable2=UserValue2

然后每个输出行将由调用FOR循环执行,然后变量将存在于调用脚本的上下文中。

答案 4 :(得分:0)

这绝不是一个答案,但由于问题的性质,这种“妥协”是我们暂时选择的路径。

我们将使用由C#应用程序创建的批处理脚本,该脚本将具有所需的所有简单set命令,然后由调用C#应用程序的CMD进程执行。

请随意添加任何进一步的想法和评论,因为这不是理想的解决方案。

答案 5 :(得分:-1)

不幸的是,据我所知,这是至少通过Windows 7提供的“解决方案”。我一直在试验各种方法来设置和随后使用环境变量,以及我的底线研究是,如果你想使用一个变量,它必须预先设置到USER或MACHINE键,或者它必须是一个局部变量,由script命令设置,然后在同一个脚本中进一步测试。

就我而言,该枚举中的第三个元素Process,基本上是无用的。我可以看到可能有用的唯一方法是,如果进程生成另一个进程,将其环境传递给子进程。对于大多数普通的管理脚本来说,这太过分了。