首页 > 解决方案 > 创建一个命令行参数 .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"

标签: windowsbatch-filecmd

解决方案


在名为的批处理文件中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是命令,%1to%9是可用的参数。

要传递参数,您可以从 CMD 提示符、快捷方式、Windows 注册表以及其他任何支持传递参数的地方进行。

如果将脚本runasadmin.cmd放置在系统 PATH 中,则可以从系统上的任何位置执行该脚本。Windows 目录位于系统 PATH 中,因此可以复制runasadmin.cmd到该位置。在runasadmin.cmdPATH 中,打开文件资源管理器并导航到文件的根目录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 /?以查看命令的内置帮助。


参考:


推荐阅读