gpt4 book ai didi

c# - 更改调用进程的环境变量

转载 作者:太空狗 更新时间:2023-10-29 23:10:37 25 4
gpt4 key购买 nike

这个问题看起来微不足道,但我已经好几天没有找到答案了。

我有一个 Windows 批处理文件,它调用 C# 程序来执行批处理文件无法完成的额外验证。验证完成后,我需要将状态和字符串返回给调用 shell。

现在返回值是微不足道的,我的 C# 控制台应用程序只是设置一个返回值(如果您愿意,可以退出代码)。而且我认为字符串也将是小菜一碟。我尝试使用以下方法定义一个新的 shell 变量:

Environment.SetEnvironmentVariable("ERR", "Some text");

此调用应该(并且确实)在当前进程 中定义一个 shell 变量 - 即创建该变量的 C# 进程。一旦 C# 应用程序终止并且创建 C# 应用程序的 shell 对该变量一无所知,该值就会丢失。所以......一个没有特别用途的调用......根本......除非我从 C3 应用程序创建一个子进程,也许它会继承我的变量。

SetEnvironmentVariable 调用的 EnvironmentVariableTarget.Machine 和 EnvironmentVariableTarget.User 目标也没有解决问题,因为只有新创建的进程才能从注册表中获取这些新值。

所以我能想到的唯一可行的解​​决方案是:

  • 写入标准输出
  • 写入文件
  • 将额外的含义编码到返回值中

前两个有点难看,最后一个有其局限性和问题。

任何其他想法(如何在父进程中设置 shell 变量)?也许这样的 shell 变量修改是一个安全问题(想想 PATH)...

感谢您的宝贵时间。

最佳答案

我遇到了和 Ryan 一样的问题,作为解决方法,我想到的唯一一件事就是写一个错误的批处理来设置变量并从批处理中调用它。

ConsoleApplication1.exe:

'put some sensible code here
'put result in variable myResult
Dim myResult As String = Guid.NewGuid().ToString("D").ToUpperInvariant()
Console.WriteLine("Normal output from the consonle app")
Console.Error.WriteLine("@ECHO OFF")
Console.Error.WriteLine("SET zzzResult={0}", myResult)

Test.cmd(调用批处理):

@ECHO OFF
:Jump to folder of batch file
PUSHD %~d0%~p0

:Define a temp file
SET zzzTempFile=%TEMP%\TMP%Random%.CMD

:Call .NET console app
ConsoleApplication1.exe 2>%zzzTempFile%

:Call the generated batch file
CALL %zzzTempFile%

:Clean up temp file
DEL %zzzTempFile%

:Clean up variable
SET zzzTempFile=

:Do something with the result
ECHO Yeah, we finally got it!
ECHO:
ECHO The value is "%zzzResult%".
ECHO:

:Clean up result variable
SET zzzResult=

:Go back to original folder
POPD

这应该可以解决问题。是的,我知道这是一篇旧帖子,Ryan 正在解决其他问题,但可能还有其他人遇到同样的问题...

关于c# - 更改调用进程的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6094805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com