создайте аргумент командной строки .bat-файл, который может изменить все параметры совместимости .exe-файлов в указанном c directroy - PullRequest
1 голос
/ 19 апреля 2020

У меня есть несколько дисков с различной структурой каталогов. У меня есть каталог с именем «test files» с несколькими файлами .exe, которые мне нужны, чтобы изменить параметры совместимости, чтобы «запускать эту программу от имени администратора»

Можно ли создать файл windows .bat, который запускается с правами администратора и может изменять все параметры совместимости файлов .exe в указанном каталоге c и всех его подкаталогах, независимо от того, где находятся «тестовые файлы», для «запуска этой программы от имени администратора»
Это то, что я до сих пор

for /r "J:test files\" %%A in (*.exe) do reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%%~A" /d "RUNASADMIN"

1 Ответ

1 голос
/ 23 апреля 2020

В пакетном файле с именем 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 откройте проводник и перейдите в каталог root файлов exe, чтобы зарегистрировать файлы exe. Оказавшись там, введите cmd в адресную строку. Подсказка CMD откроется и будет в текущем каталоге расположения Проводника. Введите runasadmin.cmd или короче runasadmin без расширения. Это запустит код пакетного файла и зарегистрирует все файлы exe в текущем каталоге и подкаталогах.

Если размещение сценария в PATH нежелательно, откройте проводник и перейдите в каталог root. сценария. Введите путь в качестве аргумента того, где находится каталог root файлов exe. Оказавшись там, введите cmd в адресную строку. Подсказка CMD откроется и будет в текущем каталоге расположения Проводника. Если каталог exe files root имеет значение 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-го аргумента присваивается переменной named undo.
  • 1-й аргумент обязателен, в противном случае отображается запрос, запрашивающий путь root.
  • if not defined root, если имя переменной не имеет значения, которое делает имя переменной undefined.
  • || exit /b 0 происходит, если ввод из приглашения пуст.
  • Введите runasadmin.cmd /? в CMD Запрос на помощь по использованию командной строки.

Предложите один из более поздних вариантов, поскольку они проверяют ошибки в командной строке или вводе. Последний код является наиболее функциональным.

, если нужна помощь с такой командой, как reg, введите reg /? в приглашении CMD, чтобы просмотреть встроенную справку по команде.


Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...