kraeved
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Artem_Butenko 1.Только для выделенных исполняемых файлов (случайно выделенные файлы с иным расширением, должны игнорироваться), путём их "перетаскивания" в окно командной строки, создать строковые параметр в системном реестре, согласно пути, - "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers". Полный путь к исполняемому файлу заключать в кавычки нельзя! Пример строкового параметра, - "C:\MyProgram1\MyProgram1.exe", со значением ~ RUNASADMIN (после символа "тильда" пробел обязателен; значение параметра в кавычк заключать нельзя). … Если можно, то реализовать функцию вывода ошибок. | Открыть консольное окно с ожиданием ввода несложно. Например, set /p "_files=". Перетащим несколько файлов на такое окно — увы, вставился путь лишь одного из них. Перетащим по одному: "D:\Мои документы\1.exe""E:\Разбор полётов"D:\МультфильмыD:\2.exe. Как видите, пути слиплись и не просматривается единый делитель, чтобы разобрать строку на элементы. Поэтому остаётся использовать классический способ — перетаскивать не на открытое консольное окно, а на батник. Сохраните код, например, как exeToReg.cmd на Рабочем столе, затем накидывайте файлы и папки. Код: @echo off rem Чтобы вести лог ошибок в кодировке UTF8, удалите rem на следующей строке rem chcp 65001 >nul set "_ext=exe" set "_logErr=%~dp0exeToReg_errors.txt" set "_argsCount=0" rem Фильтруем очередь по расширению :args for %%# in (%1) do ( rem Что на входе? if "%%~a#" geq "d" ( rem Папки pushd "%%~#" for /r %%@ in (*.%_ext%) do ( set /a "_argsCount+=1" call set "_argsArray[%%_argsCount%%]=%%~@" ) popd ) else if "%%~a#" geq "-" ( rem Файлы rem Добавьте /i после if, если помимо расширения exe нужно EXE if "%%~x#"==".%_ext%" ( set /a "_argsCount+=1" call set "_argsArray[%%_argsCount%%]=%%~#" ) ) else ( rem Ошибки echo %date% %time% Error: "%%~#" >> "%_logErr%" ) ) shift if not "%~1"=="" goto :args if %_argsCount%==0 ( rem Если очередь оказалась пустой, то выходим echo Nothing to do. Drag'n'drop some EXECUTABLES on me. goto :end ) else ( rem Или же показываем, с чем будем работать echo Items to process: %_argsCount% call :items ) rem Убедимся, что пользователь желает изменить реестр choice /n /c cq /m "Shall we (c)ontinue or (q)uit? " if %errorlevel%==1 (call :items registry) else (exit) :end pause & exit :items setlocal enableDelayedExpansion & echo; for /l %%# in (1,1,%_argsCount%) do ( if "%1"=="registry" ( rem Можно добавить ключ /f для тихой перезаписи. А ключ /t REG_SZ необязателен, т.к. этот тип данных по умолчанию. reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "!_argsArray[%%#]!" /d "~ RUNASADMIN" ) else ( echo * !_argsArray[%%#]! ) ) endlocal & echo; & exit /b | 2021-08-01 * Добавил обработку папок (избегайте папок с точкой или пробелом на конце). * Упростил код обработки папок и файлов. * Добавил вывод возможных ошибок в лог рядом с батником. * Добавил возможность вести лог ошибок в кодировке UTF8. | Всего записей: 1000 | Зарегистр. 01-03-2003 | Отправлено: 14:52 30-07-2021 | Исправлено: kraeved, 03:22 04-08-2021 |
|