Рекурсивно изменять расширения файлов в нижний регистр - PullRequest
0 голосов
/ 26 января 2019

У меня есть игра, в которую я много играю и мод, и у многих файлов в игре есть расширения файлов, которые есть во всех заглавных буквах, что меня немного беспокоит. Я пытаюсь изменить их все на строчные, но в файлах игры есть множество папок, поэтому я должен быть очень повторяющимся. Прямо сейчас я работаю с этим:

cd\program files (x86)\Activision\X-Men Legends 2\Actors
start ren *.IGB *.igb
cd\program files (x86)\Activision\X-Men Legends 2\Conversations\
start ren *.XMLB *.xmlb
cd\program files (x86)\Activision\X-Men Legends 2\Conversations\act0\tutorial\tutorial1
start ren *.XMLB *.xmlb

и т. Д. Для каждой папки в файлах игры. У меня есть очень длинный файл .bat, где у меня есть строка за строкой, но с другой папкой назначения. Есть ли способ упростить этот процесс, чтобы мне не приходилось вручную вводить каждое имя папки? Кроме того, есть ли строка, которую я мог бы добавить в начале для автоматического запуска в качестве администратора, поэтому мне не нужно каждый раз запускать файл .bat от имени администратора?

Я не ищу ничего сложного, и я очень неопытен в кодировании, кроме небольшого количества вещей, которые я смог найти.

Ответы [ 2 ]

0 голосов
/ 27 января 2019
@echo off
setlocal

rem Check if admin.
2>nul >nul net session || goto :runasadmin

rem Start in script directory.
pushd "%~dp0" || (
    >&2 echo Failed to change directory to "%~dp0".
    pause
    exit /b 1
)

rem Ask for directory to change to, else use the script directory if undefined.
set "dirpath=%~dp0"
set /p "dirpath=Dir path: "

rem Expand any environmental variables used in input.
call set "dirpath=%dirpath%"

rem Start in the input directory.
pushd "%dirpath%" || (
    >&2 echo Failed to change directory to "%dirpath%".
    pause
    exit /b 1
)

rem Ask for file extensions.
echo File extensions to convert to lowercase, input lowercase.
echo   i.e. doc txt

set "fileext="
set /p "fileext=File extension(s): "

if not defined fileext (
    >&2 echo Failed to input file extension.
    pause
    exit /b 1
)

rem Display current settings.
echo dirpath: %dirpath%
echo fileext: %fileext%
pause

rem Do recursive renaming.
for %%A in (%fileext%) do for /r %%B in (*.%%A) do ren "%%~B" "%%~nB.%%A"

rem Restore to previous working directory.
popd

echo Task done.
pause
exit /b 0

:runasadmin
rem Make temporary random directory.
set "tmpdir=%temp%\%random%"

mkdir "%tmpdir%" || (
    >&2 echo Failed to create temporary directory.
    exit /b 1
)

rem Make VBS file to run cmd.exe as admin.
(
    echo Set UAC = CreateObject^("Shell.Application"^)
    echo UAC.ShellExecute "cmd.exe", "/c ""%~f0""", "", "runas", 1
) > "%tmpdir%\getadmin.vbs"

"%tmpdir%\getadmin.vbs"

rem Remove temporary random directory.
rd /s /q "%tmpdir%"
exit /b

Ожидается, что этот скрипт будет запускаться с двойного щелчка.

Он перезапустит скрипт как администратор, если он еще не администратор.

Будет предложено получить такую ​​информацию, как каталог для изменения и получить расширения файла, т.е. doc txt ( не *.doc *.txt). Если вы введете, например, %cd% в качестве ввода каталога, он будет расширен.

0 голосов
/ 26 января 2019

Вместо того, чтобы делать это для каждой папки, используйте цикл for /R, который проходит по всем подпапкам.Я бы предложил следующий код:

@echo off

:prompt
set /p "extensions=What are the up-case extensions you want to convert to lower-case?: "
if not defined extensions (cls & goto:prompt) else (goto:loop)

:loop
for %%A IN (%extensions%) do (
    for /R "custom_folder" %%B IN (*.%%A) do (
        ren "%%~fB" "%%~nB.%%A"
    )
)

Посмотрите на this , как запустить этот командный файл от имени администратора.Создайте другой пакетный файл и добавьте код, указанный в принятом ответе.

Примечание. Как отметил Стефан в комментариях, вы можете использовать %ProgramFiles(x86)% переменную среды, которая аналогична .

...