我希望我的批处理文件只能运行提升.如果未提升,请为用户提供一个选项,以便将批次重新启动.
我正在编写批处理文件来设置系统变量,将两个文件复制到Program Files位置,然后启动驱动程序安装程序.如果Windows 7/Windows Vista用户(启用了UAC,即使他们是本地管理员)在没有右键单击并选择"以管理员身份运行"的情况下运行它,他们将获得"拒绝访问"复制这两个文件并编写系统变量.
如果用户实际上是管理员,我想使用命令自动重启批处理.否则,如果他们不是管理员,我想告诉他们他们需要管理员权限才能运行批处理文件.我正在使用xcopy来复制文件,使用REG ADD来编写系统变量.我正在使用这些命令来处理可能的Windows XP机器.我在这个主题上发现了类似的问题,但没有任何关于将批处理文件重新启动为高架的问题.
我想创建一个批处理文件以将当前目录添加到我的系统变量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 值并分配给另一个变量。
我正在尝试将当前目录(从命令行)永久添加到 Windows 路径,但是我在实现这个时遇到了严重的问题。
我最初的尝试是:
set PATH=%PATH%;%cd%
Run Code Online (Sandbox Code Playgroud)
但是,这只适用于当前会话;只要我关闭命令行窗口,PATH
环境变量就会保留其先前的值。
接下来,我尝试:
setx PATH=%PATH%;%cd%
Run Code Online (Sandbox Code Playgroud)
根据我在此处找到的一些答案,这可能适用于 Windows 7 和 8,但在 Windows 10 中,该setx
命令具有三种工作方式:
Syntax 1:
SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M]
Syntax 2:
SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M]
Syntax 3:
SETX [/S system [/U [domain\]user [/P [password]]]]
/F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
Run Code Online (Sandbox Code Playgroud)
长话短说,我无法让它工作:
ERROR: Invalid syntax. Default option is not allowed more than …
Run Code Online (Sandbox Code Playgroud) 我有一个批处理文件,我使用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)