У меня есть папка с множеством файлов и папок внутри.

Я хотел бы скопировать это в другое место, чтобы в результате получилась папка с той же структурой файлов и папок, но со всеми файлами в формате 8.3.

Как это сделать?

PS: Ну, некоторые файлы имеют расширения, содержащие более 3 символов (например, home.sh3d, windows.theme и т.д.), Поэтому, когда я говорю о преобразовании всех имен файлов в 8.3, я хотел бы сказать о преобразовании их в 8.Формат X (т.е. не изменять расширения).

2 ответа2

2

ROBOCOPY позволит вам указать флаг /FAT для пункта назначения, который будет использовать имена файлов 8.3. Я не уверен, как это будет действовать с более длинными расширениями. Но это всего лишь копия, поэтому экспериментировать не помешает.

http://ss64.com/nt/robocopy.html

1

Вы всегда можете попробовать использовать команду for с модификаторами параметров. Если у файлов вообще есть короткое имя файла, следующая команда должна работать при вводе в диалоговом окне «Выполнить» или в командной строке:

cmd /c for %F /d /r in ("input\*.*") do @xcopy /i "%~F" "temp%~spF%~snF%~xF"

Конечно, замените input вашим реальным именем папки. Это поместит все короткие имена файлов в temp , но внутри одной или нескольких других папок. Просто продолжайте открывать папки, пока не дойдете до input папки, переименуйте ее так, как вы хотите, чтобы она называлась, и переместите ее туда, куда вы хотите. Затем удалите temp папку.

Если у вас нет коротких имен файлов, вам придется генерировать их самостоятельно. Используя ваш предпочтительный метод, скопируйте все ваши файлы из входной папки в место назначения. Затем скопируйте и вставьте следующее в Блокнот:

@echo off
cd "%~1"
for /r /d %%F in (*.*) do call :START "%%~F"
for /r %%F in (*.*) do call :START "%%~F"  
pause
GOTO :EOF

:START
setlocal
set path=%~d1%~p1
set name=%~n1
set ext=%~x1
set short=%name: =%
set short=%short:.=%
set short=%short:~0,6%
set short=%short:,=_%
set short=%short:[=_%
set short=%short:]=_%
set short=%short:+=_%

:LOOP
set /a num += 1 
if /i %num% GEQ 10 set short=%short:~0,5%&& echo +10
if /i %num% GEQ 100 set short=%short:~0,4%&& echo +100
if /i %num% GEQ 1000 set short=%short:~0,3%&& echo +1000
if exist "%path%%short%~%num%%ext%" GOTO LOOP
move "%~1" "%path%%short%~%num%%ext%" 
echo "%path%%short%~%num%%ext%"

Сохраните его как «8dotX.bat» (включая кавычки). Чтобы запустить его, перетащите скопированную папку на него, и все файлы и папки в нем будут переименованы.

Обратите внимание, что это не на 100%, поскольку имена файлов, которые уже являются короткими, будут переименованы, а знак равенства (=) не будет заменен на _, как это было бы в DOS. Первая причина заключается в том, что правильная обработка приведет к тому, что пакетный файл займет как минимум вдвое больше времени для завершения, а вторая - потому что это не может быть сделано в чистом пакетном режиме. Он также ограничен только 9999 файлами с одинаковыми начальными буквами и не беспокоится об изменении имен файлов в верхний регистр. Я думаю, что эти ограничения будут работать с вашим вариантом использования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .