【问题标题】:set variable to cmd.exe将变量设置为 cmd.exe
【发布时间】:2010-07-10 10:12:16
【问题描述】:

问候地球人,

这是我的问题:

如何创建一个程序,将变量设置为 cmd.exe 的当前会话,例如

c:\> set myvar
Environment variable myvar not defined
c:\>myexe.exe
c:>set myvar
myvar=myvalue

我发现的唯一类似的主题是这个 -

How can I change Windows shell (cmd.exe) environment variables from C++?

但我没有得到一个字:

有一种方法...只需注入您的 代码进入父进程并调用 cmd里面的SetEnvironmentVariableA 过程记忆。只注射后 释放分配的内存。

虽然 C/C++ 不是我的“本机”语言,但当我用“c++ 注入代码”等搜索谷歌时,我感到自己完全迷失了……有没有一篇文章可以让我获得更多关于这方面的信息.

顺便说一句,现在我正在使用一个有点愚蠢的解决方法。将变量设置为

HKEY_CURRENT_USER\环境

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

比较容易我只是在注册表中记录类似的变量:

load.temp.vars=set myvar1=myval1&set myvar2=myval2& ....

然后只需调用 %load.temp.vars% 它将作为命令执行:

c:/>%load.temp.vars%
c:/>set myvar1
myvar1=myval1

效果很好,但对我来说还不够好:)

长寿富贵, \\//_

【问题讨论】:

标签: c++ windows shell variables cmd


【解决方案1】:

查看这篇文章:Three Ways to Inject Your Code into Another Process

此外,您可能还需要父进程的句柄(以确定要更改其环境的目标进程)。 here 描述了一种获取方法。

请记住,注入可能不起作用,具体取决于用户帐户权限,而且一些特别偏执的防病毒解决方案可能不赞成它。

【讨论】:

    【解决方案2】:

    有非常简单的方法可以做到这一点没有任何技巧

    您应该编写一个小程序myexe.exe,它会产生一个简单的输出(控制台输出),如下所示:

    SET myvar=Some value
    

    然后您通过以下步骤开始您的程序:

    myexe.exe >%TEMP%\t.cmd
    call %TEMP%\t.cmd
    del %TEMP%\t.cmd
    

    现在在启动 myexe.exe 的当前cmd.exe 中存在环境变量myvar,它的值是Some value。这不正是你想要的吗?

    方法非常简单,适用于所有版本的 Windows(不仅限于 Windows)。所以这是我给你的建议。

    【讨论】:

    • 您发布的示例仅适用于 Windows。然而,这个方法是通用的(如果你假设每个人都有一些 shell 解释器,比如 Bash)。
    • 我的意思是导致方法(或方式)
    • @Johannes:每个人都可以有自己的看法。如果您更喜欢仅使用一个值生成输出,而不是必须批量编写更多非常慢的代码,请执行此操作。此外,在实际情况下,您需要设置的不是一个,而是一组环境变量。在这种情况下,几行“SET myvar=Some value”的输出是我所知道的最佳解决方案。我第一次使用未记录但众所周知的功能在 MS DOS 中解决此类问题。后来我测试了不同的方法并找到了我认为最好的方法。如果您确实喜欢其他方式,请使用它。
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2021-11-01
    • 2010-11-04
    • 2023-03-24
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多