我在DOS命令进程中启动了一个C#控制台可执行文件。
我需要能够从C#可执行文件中执行DOS命令(特别是我需要能够设置变量)并使变量保持不变,以便DOS进程的其余部分可以引用它们。
即:
启动DOS进程 - > C#执行SET命令来设置UserVariable - > DOS进程可以ECHO%UserVariable%
由于性能原因,我无法将set命令写入dos脚本。实际上,我根本没有任何文件I / O.
有人可以帮忙吗?
答案 0 :(得分:4)
SETX持久化环境变量。检查一下:http://technet.microsoft.com/es-es/library/cc755104(v=ws.10).aspx
答案 1 :(得分:3)
问题不在于您是在C#应用程序中调用SET。即使您打开Windows提示符并调用SET来设置用户变量,它也不会在会话中持续存在。
显示,设置或删除CMD环境变量。改变了 SET将仅保留当前CMD会话的持续时间。
我建议你直接通过.Net设置变量。您可以使用Environment.SetEnvironmentVariable执行此操作。
答案 2 :(得分:1)
请改用以下.NET方法:
答案 3 :(得分:1)
如果您正在从dos脚本运行C#应用程序并希望之后从脚本中使用应用程序中设置的变量,我不知道如何在C#中为该脚本的上下文执行此操作,另一个这里的答案向您展示了机器本身,但我感谢您需要一些不太长久的东西。
元编程解决方法可以是:
调用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,基本上是无用的。我可以看到可能有用的唯一方法是,如果进程生成另一个进程,将其环境传递给子进程。对于大多数普通的管理脚本来说,这太过分了。