我有多个驱动器,有不同的目录结构。 我有一个名为 "测试文件 "的目录,里面有几个.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提示符不需要使用 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
是一个命名的变量,它被第1个脚本参数所取代。如果 %2
会被第二个脚本参数取代。%0
是命令和 %1
到 %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\
和子目录。任何有效的目录路径都可以作为第1个参数传递。
一些与 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
如果提示中的输入为空,则会发生。runasadmin.cmd /?
在CMD Prompt中帮助使用命令行。建议使用后面的一个变化,因为它们会检查命令行或输入中的错误。最后的代码是最有特色的。
如果需要帮助的命令,如 reg
,进入 reg /?
在CMD Prompt中查看该命令的内置帮助。
参考资料: