Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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 7 通过批处理文件为系统设置环境变量_Windows 7_Batch File_Environment Variables - Fatal编程技术网

Windows 7 通过批处理文件为系统设置环境变量

Windows 7 通过批处理文件为系统设置环境变量,windows-7,batch-file,environment-variables,Windows 7,Batch File,Environment Variables,我正在使用.bat文件为我的引擎自动化一些任务(一旦它从存储库中新克隆出来)。其中一项任务是设置环境变量。我正在使用SETX命令,并将命名变量的路径设置为%CD%,即运行安装程序的目录 尽管用户需要注销/登录,这可能会让人恼火,但这很管用。如果变量设置为系统变量,则不需要此注销/登录周期(我不确定为什么,但重新启动Visual Studio对用户环境变量没有影响…也就是说,它检测不到任何更改,但会检测到系统变量的更改)。因此,我继续使用-m命令。不幸的是,这要求批处理文件具有管理员权限。没有问题

我正在使用
.bat
文件为我的引擎自动化一些任务(一旦它从存储库中新克隆出来)。其中一项任务是设置环境变量。我正在使用
SETX
命令,并将命名变量的路径设置为
%CD%
,即运行安装程序的目录

尽管用户需要注销/登录,这可能会让人恼火,但这很管用。如果变量设置为系统变量,则不需要此
注销/登录周期(我不确定为什么,但重新启动Visual Studio对用户环境变量没有影响…也就是说,它检测不到任何更改,但会检测到系统变量的更改)。因此,我继续使用
-m
命令。不幸的是,这要求批处理文件具有管理员权限。没有问题;我以管理员身份运行批处理文件。嗯,现在我遇到了一个问题。当前目录变量
%CD%
已从运行安装程序的目录更改为
C:\Windows\System32


现在我们来谈谈这个问题如何通过使用
%CD%
的批处理文件设置系统环境变量,而不将其默认设置为
C:\Windows\System32
。请注意,相当多的人使用安装程序,我希望这个过程尽可能无痛无误。也就是说,不需要手动输入。当前,如果在没有管理员权限和
-m
的情况下运行,则只需执行
注销/登录
循环。否则,一切都是自动化的

%0
是批处理文件的名称。您可以使用%%dp0和
pushd
切换到批处理文件所在的目录,然后从那里转到任何目录。因此,此类批处理文件的一般结构为:

@echo off
pushd %~dp0
rem batch file commands go here
popd
至于你的Visual Studio问题。。。用户模式环境变量可用于设置环境变量后启动的每个进程。但由于某些原因,当前进程没有收到它。但是Explorer.exe(负责处理开始菜单和run命令)似乎在每次需要时都会获取环境的新副本

以这种方式启动的进程将拥有新环境,而从命令行启动的进程将继承旧环境,而不使用由
setx设置的新变量

您可以通过将批处理文件更改为变量的
set
setx
来缓解此问题

这里有一些代码让你开始。它会

  • 显示当前工作目录
  • 更改脚本所在的目录
  • 在正在运行的shell中设置变量MYTEST
  • 在用户环境中设置变量
  • 从shell启动记事本,以便您可以尝试打开文件名%MYTEST%
    • 用%试试看,效果很好
    • 顺便说一句,请注意当前目录是如何更改的
  • 要求您从“开始”菜单手动启动记事本
  • 这是代码,嗯

    @echo off
    
    ::This is where we start
    echo Current directory is %CD%
    echo %0
    
    ::We change the current directory to where the script is running
    pushd %~dp0
    
    echo Current directory is %CD%
    
    ::if you want, you can move relatively from it
    cd..
    
    ::Set an environement variable
    set MYTEST=%~f0
    ::Make a copy avaiable to other processes
    setx MYTEST "%MYTEST%"
    
    ::Now I should be able to fire notepad and open %%MYTEST%% 
    ::(you can use the %% sign in the open box)
    ::Let's start a copy from this process
    ::
    echo Starting notepad, open the file %%MYTEST%%, you should this 
    echo file thanks to the set statement.
    notepad
    echo Now launch Notepad from the start menu and open the file %%MYTEST%%, 
    echo you should this file thanks to the setx statement.
    
    ::Wherever you end up, restore the current directory
    popd
    
    echo Current directory is %CD%
    

    请考虑,要使用bat脚本设置ant,请执行以下操作:

    echo off 
    echo SETTING UP ANT FOR THE BUILD ....
    set ANT_HOME=%~dp0%build\apache-ant-1.8.2
    set ANT_BIN=%~dp0%build\apache-ant-1.8.2\bin
    
    SET path=%path%;%ANT_BIN%;%ANT_BIN%;
    
    echo PATH: %path%
    echo ANT_HOME: %ANT_HOME%
    echo ANT_BIN: %ANT_BIN%
    echo ANT GOT INSTALLED ....