我正在尝试编写一个脚本,单击该脚本时会在Windows中的PATH环境变量中添加几个条目,而不是手动进行更改.我看到.bat文件在Windows上一直被用于各种原因,因此.bat脚本可以帮助我这样的东西吗?
我实际上需要从Internet上的某个位置下载zip,将其解压缩到指定位置,然后更新环境变量中的PATH.从来没有这样做,所以任何提示赞赏.
我想创建一个批处理文件以将当前目录添加到我的系统变量PATH( 不是我的用户变量)。
当我使用时:
SETX /M PATH "%CD%;%PATH%"
Run Code Online (Sandbox Code Playgroud)
它做了所需的事情。但是,我收到一条错误消息:
保存的数据被截断为 1024 个字符。
当我使用 GUI 检查系统变量时,我看到用户路径已添加到系统路径中。因此,系统路径有重复的条目。
我尝试将%PATH%变量分配给临时变量并进行回显,但我也看到了重复的情况。
我在一些堆栈答案中看到,%PATH%我们在批处理文件中使用的变量实际上是用户路径和系统路径的串联。
在命令提示符下,我尝试了:
REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH"
Run Code Online (Sandbox Code Playgroud)
但我不太清楚我们是否可以使用它来获取该 PATH 值并分配给另一个变量。
我正在阅读一篇关于ss64关于命令提示符中的环境变量的文章。
本文后面有一个表,其中列出了命令提示符中常见的环境变量。其中列出的一些变量被称为易失性(只读)。文章中的一句话指出:-
动态环境变量是只读的,并且每次扩展变量时都会进行计算。当所有变量都用 SET 列出时,这些变量将不会出现在列表中。不要尝试直接设置动态变量。
后两句话我明白了。但我无法理解第一个。
疑问:-
%userprofile%是非易失性变量,解析为%SystemDrive%\Users\{username},%homepath%是易失性变量,解析为Users\{Username}。这两个命令非常相似(除了systemdrive)。那为什么一个是易失性的,另一个是非易失性的呢?
变量动态的标准是什么?是什么使%appdata%(只是一个例子)成为非易失性变量?
每次扩展变量时都会计算动态变量,这对于诸如此类的变量是有意义的,%CD% %DATE% %TIME% %RANDOM%因为如果它们是非易失性的,它们就会失去其功能。但效果如何呢%homepath%?
一些非易失性变量中含有某种动态成分。前任。%userprofile%有%SystemDrive%并且{username}在它的路径中。那么这些变量怎么不是动态的呢?
我有一个在命令行中完美运行的单行代码段,但在我作为批处理脚本的一部分运行时失败并引发错误.
以下命令按预期运行,删除文件夹中的所有空子文件夹.
for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"
Run Code Online (Sandbox Code Playgroud)
但是,当放入批处理文件时...
FOR /f "delims=" %%d in ('dir /s /b /ad ^| sort /r') do rd "%%d"
Run Code Online (Sandbox Code Playgroud)
...它抛出了标准错误:
排序不被识别为内部或外部命令
我一直在尝试了一个小时左右,有和没有逃脱管,改变的选项的顺序,查找两者的文件dir和sort等等,但我还是没能弄清楚这是怎么回事这里.批处理文件的其余部分(只有几行)工作正常,这是其中唯一失败的行.
有人可以帮忙吗?
我有一个批处理文件,我使用system("name.bat"). 在该批处理文件中,我试图读取注册表项的值。从 C++ 调用批处理文件会导致set KEY_NAME=HKEY_LOCAL_MACHINE\stuff失败。
但是,当我直接运行批处理文件(双击它)时,它运行良好。不知道我做错了什么。
批处理文件:
set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Ansoft\Designer\2014.0\Desktop
set VALUE_NAME=InstallationDirectory
REG QUERY %KEY_NAME% /v %VALUE_NAME%
Run Code Online (Sandbox Code Playgroud)
C++文件:
int main(void)
{
system("CALL C:\\HFSS\\setup_vars.bat");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新1:
我发现密钥实际上在 64 位注册表中,并且我正在将 C++ 解决方案构建为 32 位。一旦我解决了这个问题,它就会发现注册表项很好。
现在我在将该路径添加到我的PATH变量时遇到了问题。它不是创建系统变量,而是创建用户变量PATH并将其添加到那里。
从命令行运行有效。
代码:
set KEY_NAME=HKLM\SOFTWARE\Ansoft\Designer\2014.0\Desktop\
set VALUE_NAME=InstallationDirectory
FOR /F "usebackq skip=1 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME%`) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
if defined ValueName (
@echo Value Value = %ValueValue%
) else …Run Code Online (Sandbox Code Playgroud) 我有批处理文件,用于设置用户路径,并作为Visual Studio IDE构建步骤的一部分运行.
@ECHO OFF
@ECHO %PATH%
set COMSPEC = "%VCINSTALLDIR%\vcvarsall.bat" amd64
setx PATH "..\..\lib\libsndfile;..\..\lib\simulink"
@ECHO %PATH%
Run Code Online (Sandbox Code Playgroud)
当我构建项目,关闭VS,并重新打开它,并重建时,我将附加路径视为PATH变量的一部分.但是,我看到在Windows环境中设置环境变量PATH变量是在用户环境变量下创建的
..\..\lib\libsndfile;..\..\lib\simulink
Run Code Online (Sandbox Code Playgroud)
问题1:
为什么此路径也作为附加路径显示为系统环境变量的一部分?
在echo %PATH%通过Visual Studio控制台执行时(当我第二次运行项目时)打印系统变量路径和我创建的新路径附加到它.
问题2:
我想修改我的批处理文件,以便它只PATH在首次运行Visual Studio构建期间在用户设置中设置一次环境变量.如果用户变量PATH在后续运行中已存在,则不应再次执行set命令以避免在系统变量中反复添加新路径.
任何想法如何实现这一目标?
在我的公司,我们使用批处理文件来启动Matlab.批处理文件在启动Matlab之前准备环境.
Matlab本身就是以
START MATLAB.EXE
Run Code Online (Sandbox Code Playgroud)
我的系统上安装了几个版本的Matlab.而且这个命令启动了错误的Matlab版本.START在哪里寻找可执行文件?