Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Windows资源管理器传递环境变量_Windows_Batch File_Windows Explorer - Fatal编程技术网

通过Windows资源管理器传递环境变量

通过Windows资源管理器传递环境变量,windows,batch-file,windows-explorer,Windows,Batch File,Windows Explorer,我想设置一个环境变量,然后生成一个Windows资源管理器窗口,使从这个新的资源管理器窗口启动的进程继承该环境变量。我想这样做,以便我正在与TortoiseSVN shell扩展集成的diff工具能够访问项目启动脚本中设置的特定于项目的环境变量。但显而易见的方法似乎在某个地方失去了环境变量: 启动cmd.exe set MYVAR=“foo” set | findstr MYVAR 结果包含MYVAR=“foo” explorer. 在生成的资源管理器窗口中,按住Shift键并右键单击文件夹,然

我想设置一个环境变量,然后生成一个Windows资源管理器窗口,使从这个新的资源管理器窗口启动的进程继承该环境变量。我想这样做,以便我正在与TortoiseSVN shell扩展集成的diff工具能够访问项目启动脚本中设置的特定于项目的环境变量。但显而易见的方法似乎在某个地方失去了环境变量:

  • 启动cmd.exe
  • set MYVAR=“foo”
  • set | findstr MYVAR
  • 结果包含MYVAR=“foo”
  • explorer.
  • 在生成的资源管理器窗口中,按住Shift键并右键单击文件夹,然后选择“在此处打开命令窗口”
  • set | findstr MYVAR
  • 结果不包含MYVAR
  • 我已将Windows资源管理器设置设置设置为,希望这会有所帮助,但似乎没有效果

    我可以使用
    setx
    而不是
    set
    全局存储变量,但是如果我希望多个窗口具有不同版本的MYVAR(例如,如果我同时处理多个项目),这将不起作用


    有没有办法设置Windows资源管理器窗口特定的环境变量,该变量将由其所有子进程继承?

    程序将获取其启动进程环境变量的副本。因此,如果您正在生成一个新进程(文件夹选项-视图中的一个设置),这一点是有效的

    请记住,必须指定
    /n
    命令行参数才能在一个文件夹中强制打开两个窗口

  • 打开命令

    setx foo bar

  • 启动浏览器

    开始

  • 打开新的命令窗口(按住Shift键并右键单击文件夹)

  • 类型

    集福

  • 输出

    foo=bar

  • 现在,如果您返回到在2中打开的cmd并键入

    setx foo bar2

  • 在3中打开的CMD仍将显示

    >set foo
    foo=bar
    
    但是,如果您从6中打开的CMD中的资源管理器中打开一个新的CMD.EXE,您将得到

    >set foo
    foo=bar2
    

    这是因为SETX将创建或修改的变量传递给未来的命令窗口,但不在当前或已创建的CMD.exe中。

    据我所知,资源管理器进程从运行“开始”菜单的进程继承其环境。您可以通过注销和重新登录,或者通过关闭进程并使用Task Manager重新启动它来重置该环境,但我不知道有什么方法可以在维护不同的环境变量集(使用不同的用户除外)的同时,使用不同的环境来实例一个新的
    explorer.exe
    进程。如果微软专门检查以确保不会发生这种情况,我不会感到惊讶。老实说,这听起来像是XY问题。你到底想完成什么?为什么不使用批处理脚本或命令行与命令行svn客户端一起使用,该客户端通常与OrtoiseSVN一起安装到
    C:\Program Files\OrtoiseSVN\bin
    ?OrtoiseSVN配置为为为某些二进制文件启动特殊的差异工具,在处理差异之前,此差异工具需要知道在何处找到用于其他配置的项目特定目录。我的环境中的其他工具已经使用项目启动脚本设置的环境变量来查找此目录。因此,我的目标是在diff工具中使用该环境变量(每个项目都会更改)。由于TortoiseSVN是通过Windows资源管理器启动的,所以我想让Windows资源管理器将该环境变量传递给TortoiseSVN(并进一步传递给diff工具),如果解决方案涉及大量脚本编写和调用特殊命令来启动浏览器窗口,那么只需编写工具代码,使用适当的环境变量直接调用TortoiseSVN对话框可能会更容易。这正是我所认为的工作方式,但请看我的示例。出于某种原因从explorer窗口启动的cmd.exe无法获取在启动explorer.exe之前设置的变量的副本。请记住,这是一个新进程,而不是新窗口。我正在观看任务管理器,每次我创建一个新流程时,它都会切换到现有流程。你为什么需要浏览器呢。此代码为您提供了一个资源管理器类型的东西
    (将其命名为something.hta)是的,我设置了为每个窗口创建新进程的选项,并且我还尝试使用显式的
    explorer/separate
    方法启动新的explorer进程。两者都有相同的结果,即在您的示例中,任何一个explorer窗口都不能使用您正在设置的
    a
    变量的任何值启动新进程。我需要浏览器窗口启动外壳扩展工具,如OrtoiseSVN,我需要这些工具设置一个环境变量。试试hta。它是在浏览器中显示文件的同一个对象,只是在不同的主机中。嗯,.hta可以工作,但实际上是有限的。例如,如果我浏览到一个子目录,我就不能“返回”或“升级”,至少我看不到。因此,这个解决方案似乎需要大量的代码来创建一个真正的资源管理器窗口的替换项。这是因为setx.exe更新注册表中的环境变量值,然后向顶级窗口广播一条消息。资源管理器接收到一条消息,表明环境设置已被删除修改后,它将从注册表重新加载自己的环境。随后,从资源管理器启动的cmd.exe的新实例将获得更新环境的副本。问题是它会持续修改环境。最后一个值将在会话中被记住。如果这是一个问题,则必须在最后一次调用setx i才能删除变量。这是一个合理的解决方法,只要我一次只处理一个项目。但是,由于从explorer创建的所有新进程都将从
    setx
    继承最后一个变量,因此一次处理多个项目的选项是有限的。
    >set foo
    foo=bar2