我有多个具有不同目录结构的驱动器。 我有一个名为"测试文件"的目录,其中包含几个.exe文件,我需要将兼容性设置更改为"以管理员身份运行此程序">
是否可以创建一个以管理员身份运行的 Windows .bat 文件,该文件可以更改特定目录及其所有子目录中的所有.exe文件兼容性设置,无论"测试文件"位于何处,以"以管理员身份运行此程序">
这就是我到目前为止所拥有的
for /r "J:test files" %%A in (*.exe) do reg add "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "%%~A" /d "RUNASADMIN"
在名为runasadmin.cmd
的批处理文件中:
@echo off
for /r "C:test files" %%A in (*.exe) do reg add "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "%%~A" /d "RUNASADMIN"
使用C:test files
作为示例路径,因为大多数用户将拥有C:
驱动器。
在交互式 CMD 提示中:
for /r "C:test files" %A in (*.exe) do reg add "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "%~A" /d "RUNASADMIN"
此批处理文件代码将递归exe
文件的目录C:test files
,并在 Windows 注册表中注册它们以管理员身份运行。交互式 CMD 提示符不需要使用另一个%
转义for
变量%A
,因为该命令的解析次数少于批处理文件的次数。
要创建一个可以接受可变路径的批处理文件,那么这可能是合适的,尽管没有参数检查来验证:
@echo off
for /r %1 %%A in (*.exe) do reg add "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "%%~A" /d "RUNASADMIN"
%1
是一个命名变量,由第一个脚本参数替换。如果使用%2
,它将替换为第二个脚本参数。%0
是命令,%1
是可用的参数%9
。
要传递参数,您可以从CMD提示符,快捷方式,Windows注册表以及支持传递参数的任何其他位置执行此操作。
如果将脚本runasadmin.cmd
放置在系统 PATH 中,则可以从系统上的任何位置执行。Windows 目录位于系统 PATH 中,因此可以将runasadmin.cmd
复制到该位置。在 PATH 中使用runasadmin.cmd
,打开文件资源管理器并导航到exe
文件的根目录以注册exe
文件。在那里,在地址栏中键入cmd
。CMD提示符将打开,并将位于文件资源管理器位置的当前目录中。输入runasadmin.cmd
或不带扩展名的较短runasadmin
。这将运行批处理文件代码并注册当前目录和子目录中的所有exe
文件。
如果不需要将脚本放在 PATH 中,请打开文件资源管理器并导航到脚本的根目录。输入路径作为exe
文件根目录所在位置的参数。在那里,在地址栏中键入cmd
。CMD提示符将打开,并将位于文件资源管理器位置的当前目录中。如果exe
文件根目录是C:test files
,则输入命令runasadmin "C:test files"
。这将运行批处理文件代码,并在C:test files
和子目录的目录中注册所有exe
文件。任何有效的目录路径都可以作为第一个参数传递。
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 "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /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 "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "%%~A" /f >nul
) else (
reg add "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /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 /?
以查看命令的内置帮助。
引用:
- Windows CMD 命令的 A-Z 索引
- 操作方法:将命令行参数(参数)传递给 Windows 批处理文件
- 命令行参数