创建一个命令行参数的.bat文件,可以改变特定directroy中所有.exe文件的兼容性设置。

问题描述 投票:0回答:1

我有多个驱动器,有不同的目录结构。 我有一个名为 "测试文件 "的目录,里面有几个.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"
windows batch-file cmd
1个回答
1
投票

在名为 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%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 被定义。
  • 第1个参数的值被分配给名为 root.
  • 第2个参数的值被分配到名为 undo.
  • 第1个参数是必须的,否则会显示提示,要求输入根路径。
  • if not defined root 如果变量名没有值,使得变量名为 undefined.
  • || exit /b 0 如果提示中的输入为空,则会发生。
  • 输入 runasadmin.cmd /? 在CMD Prompt中帮助使用命令行。

建议使用后面的一个变化,因为它们会检查命令行或输入中的错误。最后的代码是最有特色的。

如果需要帮助的命令,如 reg,进入 reg /? 在CMD Prompt中查看该命令的内置帮助。


参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.