windows - 创建一个命令行参数 .bat 文件,该文件可以更改特定目录中的所有 .exe 文件兼容性设置
问题描述
我有多个具有不同目录结构的驱动器。我有一个名为“测试文件”的目录,其中包含几个 .exe 文件,我需要将兼容性设置更改为“以管理员身份运行此程序”
是否可以创建一个以管理员身份运行的 Windows .bat 文件,并且可以更改特定目录及其所有子目录中的所有 .exe 文件兼容性设置,无论“测试文件”位于何处,以“运行此程序作为管理员”
这是我迄今为止所拥有的
for /r "J:test files\" %%A in (*.exe) do reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /d "RUNASADMIN"
解决方案
在名为的批处理文件中runasadmin.cmd
:
@echo off
for /r "C:\test files\" %%A in (*.exe) do reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /d "RUNASADMIN"
使用C:\test files\
作为示例路径,因为大多数用户都会有一个C:
驱动器。
在交互式 CMD 提示中:
for /r "C:\test files\" %A in (*.exe) do reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%~A" /d "RUNASADMIN"
此批处理文件代码将递归文件目录并将它们C:\test files\
注册exe
到 Windows 注册表中以以管理员身份运行。交互式 CMD Prompt 不需要将for
变量%A
与另一个变量一起转义,%
因为该命令的解析次数少于批处理文件。
要制作一个可以接受变量路径的批处理文件,那么这可能是合适的,尽管没有要验证的参数检查:
@echo off
for /r %1 %%A in (*.exe) do reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /d "RUNASADMIN"
这%1
是一个被第一个脚本参数替换的命名变量。如果%2
使用,它将被第二个脚本参数替换。%0
是命令,%1
to%9
是可用的参数。
要传递参数,您可以从 CMD 提示符、快捷方式、Windows 注册表以及其他任何支持传递参数的地方进行。
如果将脚本runasadmin.cmd
放置在系统 PATH 中,则可以从系统上的任何位置执行该脚本。Windows 目录位于系统 PATH 中,因此可以复制runasadmin.cmd
到该位置。在runasadmin.cmd
PATH 中,打开文件资源管理器并导航到文件的根目录exe
以注册exe
文件。在那里,输入cmd
地址栏。将打开一个 CMD 提示并将位于文件资源管理器位置的当前目录中。输入runasadmin.cmd
或更短的runasadmin
不带扩展名。这将运行批处理文件代码并注册exe
当前目录和子目录中的所有文件。
如果不需要将脚本放在 PATH 中,则打开文件资源管理器并导航到脚本的根目录。输入路径作为exe
文件根目录所在位置的参数。在那里,输入cmd
地址栏。将打开一个 CMD 提示并将位于文件资源管理器位置的当前目录中。如果exe
文件根目录是C:\test files\
,则输入命令runasadmin "C:\test files\"
。这将运行批处理文件代码并注册目录和子目录exe
中的所有文件。C:\test files\
任何有效的目录路径都可以作为第一个参数传递。
一些变化runasadmin.cmd
:
@echo off
rem Ensure 1st argument is valid.
if not "%~1" == "" (
if not exist "%~1" (
>&2 echo Require a valid directory path as the 1st argument.
exit /b 1
)
)
rem Register the exe files.
for /r %1 %%A in (*.exe) do (
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /d "RUNASADMIN" /f >nul
)
- 进行检查以确保第一个参数有效。
%~1
删除了周围%1
的双引号。>&2 echo
将以下错误消息文本回显到 stderr 流。- 如果
exit /b 1
发生这种情况,errorlevel
可以检查变量的值是否为1
. /f >nul
强制添加到注册表并将成功消息重定向到nul
,从而使成功消息静音。错误消息不会被静音。
@echo off
setlocal
@rem Display help message.
@if "%~1" == "/?" goto :help
@if "%~1" == "-h" goto :help
rem Assign all arguments to allargs.
set allargs=%*
rem Assign value of 1st argument to variable named root.
set "root=%~1"
rem Assign value of 2nd argument to variable named undo.
set "undo=%~2"
rem Enter a root path if no argument passed.
if not defined root set /p "root=Enter root path of exe files: " || exit /b 0
rem Remove any double quotes.
set "root=%root:"=%"
rem Ensure 1st argument is valid.
if not exist "%root%" (
>&2 echo Require a valid directory path as the 1st argument.
exit /b 1
)
rem Enter y or n to undo registration.
if defined undo (
if "%undo%" == "1" set "undo=y"
) else if not defined allargs (
set /p "undo=Undo registration [n|y]: "
)
if /i not "%undo%" == "y" set "undo="
rem Register the exe files.
for /r "%root%" %%A in (*.exe) do (
echo ENTRY: "%%~A"
if defined undo (
reg delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /f >nul
) else (
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /d "RUNASADMIN" /f >nul
)
)
exit /b 0
:help
echo Syntax: "%~nx0" [root [undo]]
echo:
echo Examples:
echo To register exe files in "C:\test files\".
echo "%~nx0" "C:\test files\"
echo:
echo To undo register of exe files in "C:\test files\".
echo "%~nx0" "C:\test files\" 1
echo:
echo 1st arg is root directory to search recursively.
echo 2nd arg set to 1 to undo registration.
echo:
echo No args will display prompt for root directory and if to undo.
exit /b 0
setlocal
将脚本中的变量保留set
为脚本的本地变量。- 所有参数的值都分配给名为的变量
allargs
,以便稍后检查是否allargs
已定义。 - 第一个参数的值分配给名为 的变量
root
。 - 第二个参数的值分配给名为 的变量
undo
。 - 第一个参数是必需的,否则会显示提示询问根路径。
if not defined root
是如果变量名没有使变量名的值undefined
。|| exit /b 0
如果提示的输入为空,则会发生。- 在 CMD 提示符处输入
runasadmin.cmd /?
以获取有关命令行使用的帮助。
当他们检查命令行或输入中的错误时,建议使用后来的一种变体。最后一个代码是最有特色的。
如果需要有关命令的帮助,例如reg
,在 CMD 提示符处输入reg /?
以查看命令的内置帮助。
参考:
推荐阅读
- javascript - 如何检测 D3 v5(文本重叠)中的元素冲突
- c - 当大括号括起来的列表中的初始值设定项少于聚合的元素或成员时,C 编译器如何声明数组?
- python - 如何将 CSV 转换为固定宽度的文本文件?
- amazon-web-services - AWS 上的 Helm prometheus 自定义负载均衡器配置
- security - 访问令牌和刷新令牌最佳实践?如何实现访问和刷新令牌
- javascript - 如何查找反向后未更改位置的字符串的字符
- python - 在 Django 中注册新用户后采取行动
- python - 为什么 OpenCV 的深度学习人脸检测器不适用于旋转到一侧的图像?
- python - 从雅虎财经网站下载的数据不一致
- eclipse - 安装后lombok eclipse停止工作