我正在使用.bat
文件为我的引擎自动化一些任务(一旦它是从存储库中新克隆的)。任务之一是设置环境变量。我正在使用SETX
命令并将命名变量的路径设置为%CD%
,即从中运行安装程序的目录。
尽管用户需要log-off/log-on
这可能很烦,但这仍然可以很好地工作。如果将变量设置为系统变量,则不需要此log-off/log-on
循环(我不确定为什么,但是重新启动Visual Studio对用户环境变量没有影响...也就是说,它检测不到任何更改,但是会检测到其中的更改。系统变量)。因此,我继续使用-m
命令。不幸的是,这要求批处理文件具有管理员权限。没问题;我以管理员身份运行了批处理文件。好吧,现在我遇到了一个问题。当前目录变量%CD%
从运行安装程序的目录更改为C:\Windows\System32
。
现在开始讨论这个问题。如何通过使用%CD%
的批处理文件设置系统环境变量,而默认不使用C:\Windows\System32
。值得一提的是,很多人都在使用该安装程序,我希望此过程尽可能轻松,无错误。这意味着,不建议手动输入。当前,如果在没有管理员特权且没有-m
的情况下运行,则唯一需要的是log-off/log-on
循环。否则,一切都是自动化的。
最佳答案
%0
是批处理文件的名称。您可以将%〜dp0与pushd
一起使用,以更改至批处理文件所在的目录,并从该目录访问任何目录。因此,此类批处理文件的一般结构为:
@echo off
pushd %~dp0
rem batch file commands go here
popd
至于您的Visual Studio问题...设置环境变量后,用户模式环境变量可用于每个启动的进程。但是由于某种原因,当前进程没有收到它。但是,Explorer.exe(负责处理该开始菜单,而run命令似乎每次需要时都会获取该环境的新副本)。
以这种方式启动的进程将具有新环境,而从命令行启动的进程将继承旧环境,而无需使用
setx
设置新变量。您可以通过将批处理文件更改为
set
和setx
变量来缓解此问题。这是一些入门代码。它会
显示当前工作目录
更改脚本所在的目录
在运行的shell中设置变量MYTEST
在用户环境中设置变量
从外壳启动记事本,以便您可以尝试打开文件名%MYTEST%
尝试使用%,它可以工作
注意当前目录如何更改,顺便说一句。
要求您从开始菜单手动启动记事本
这是代码,HTH
@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%