Показать полную графическую версию : [решено] обрезать по заданному MAX PATH
shadowbat
18-06-2010, 11:51
есть список
http://img33.imageshack.us/img33/4139/43116812.jpg
я нашел как только обрезать длину файла. т.е.:
http://img64.imageshack.us/img64/1778/48831148.jpg
а нужно именно обрезать по длине пути т.е. уровнять MAX PATH
http://img27.imageshack.us/img27/3761/86389051.jpg
1. причем желательно:
чтобы я мог выбрать длину MAX PATH до которого нужно обрезать
(т.е. нужно не до 255 а скажем до 200 чтобы при копировании файлов в другое место был разбег для глубины)
2. и обязательно сохранение расширения файла.
3. как сделать чтобы захватывались для обработки длины MAX PATH только файлы с расширением pdf ?
set f1=1.txt
set f2=2.txt
set mp=100
(for /f "usebackq delims=" %%a in ("%f1%") do @(
set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa))>"%f2%"
ёпрст, откуда мода пошла текст картинками вставлять?.. прям хоть FineReader ставь
shadowbat
18-06-2010, 12:30
ёпрст, откуда мода пошла текст картинками вставлять?.. прям хоть FineReader ставь »
это специально, потому что если скопировать текстом одинаковые по длине 3 строки то они будут разные в итоге по длине визуально.
...проверил - тут вставляется правильно, а на руборде я вставил 3 строки по 100 символов а в итоге они показывалиь с визуально разной длиной. поэтому вставил картинкой
есть список
P.s. я допустил ошибку. =) есть не список а есть файлы и их нужно обрезать по длине MAX PATH через переименование например.
(с сохранением пути нахождения файла)
нужно сохранить структуру папок. там около 1800 путей с папками, подпапками и в конце пути один файл txt
т.е. количество путей с папками = количеству файлов, которые нужно обрезать
по поводу поиска например использовать такой алгоритм получится?:
поиск файла *.txt
возвращение max path
переименовка
продолжить поиск
есть не список а есть файлы »
set $m=C:\Program Files\*.txt
set $f=2.txt
set mp=50
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa))>"%$f%"
P.S. как бы после такого укорачивания имен не возникли "дубли"
если скопировать текстом одинаковые по длине 3 строки то они будут разные в итоге по длине визуально »для этого есть тег CODE
amel27, 5 минут тупил над "волшебной" строкой, удовлетворенно крякнув процетировал д.Ватсона: "Но черт возьми, КАК?!!!" (в смысле "оно еще и работает")
shadowbat, Вы кажется говорили про pdf, а сейчас уже про txt...
shadowbat
18-06-2010, 12:55
set $m=C:\Program Files\*.txt
set $f=2.txt
set mp=50
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa))>"%$f%"
так ведь этот код делает СПИСОК структуры папок. а потом этот список укорачивает по max path
а как сделать чтобы вместо списка он работал с самими файлами, и изменял имена файлов с учетом max path?
//забрал себе в коллекцию батник. у меня 3 програмки есть по созданию списка файлов - amel27, но Ваш bat самый простой и главное удобный когда нужно без заморочек сделать листинг файлов !
shadowbat, Вы кажется говорили про pdf, а сейчас уже про txt... »
разницы ведь нет. расширение задается в самом коде
shadowbat
18-06-2010, 13:57
кто может помочь?
вроде процедура стандартная. так сказать основополагающая. любой кто сталкивался с длинными именами должен иметь у себя в заначке методы работы с ними, как например обрезка по заданной длине...
=) в гугле поиск по фразе "max path" + "только на русском" выдает первую же ссылку в эту тему
shadowbat
18-06-2010, 16:24
не знаю помогут тут или нет реализовать через BAT/CMD, но если кому то тоже понадобится такая MAX_PATH обрезка - мне помогли в соседней ветке
AutoIt-решение от Creator'a http://forum.oszone.net/post-1436849.html#post1436849
кто может помочь? »
слишком часто меняете условие задачи - не успеваю править батник,
вариант с выводом в "*_TST.CMD" (для ознакомления перед запуском):
set $m=C:\Program Files\*.txt
set $f=%~n0_tst.cmd
set mp=50
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"& call set "c=%%b:~0,%mp%%%"& call call set "d=%%%%b:%%c%%=%%%%"
if defined d call echo move "%%a" "%%c%%%%~xa"))>"%$f%"
мне помогли в соседней ветке »вы еще попросите на VBS... и в "программировании" на Си... и на Delphi... вдруг кому понадобится (см. п.2.2 правил (http://forum.oszone.net/rules.html))
shadowbat
18-06-2010, 17:05
вариант с выводом в "*_TST.CMD" (для ознакомления перед запуском): »
наверняка я что то не так понял. изменил C:\Program Files\ на нужные различные пути - в любом случае создается _tst.cmd пустой размером 0кб. а имена файлов не изменяются
(см. п.2.2 правил) ок. больше не повторится
shadowbat, в файл выводятся только файлы, длина пути которых (без расширения) превышает заданный лимит
shadowbat
18-06-2010, 18:13
я так понял папка из которой запускается батник не важна.
при таком коде создается пустой cmd
set $m=C:\08. Дом и Хобби\Йога\Йога - искусство быть стройным\*.pdf
set $f=%~n0_tst.cmd
set mp=60
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"& call set "c=%%b:~0,%mp%%%"& call call set "d=%%%%b:%%c%%=%%%%"
if defined d call echo move "%%a" "%%c%%%%~xa"))>"%$f%"
shadowbat, кодировка самого батника DOS (866)? (блокнот не катит)
shadowbat
18-06-2010, 18:58
shadowbat, кодировка самого батника DOS (866)? (блокнот не катит) » старею... создавал ПКМ -> txt, открывая и сохраняя его через Bred2k. оказывается Bred2k не всегда сохраняет правильно. bat не выполнялся из-за кодировки, благодарю за наводку
РЕШЕНИЕ:
chcp 1251
set $m=C:\Program Files\*.txt
set $f=%~n0_tst.cmd
set mp=50
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"& call set "c=%%b:~0,%mp%%%"& call call set "d=%%%%b:%%c%%=%%%%"
if defined d call echo move "%%a" "%%c%%%%~xa"))>"%$f%"
"%$f%"
chcp 866
P.S. причем если mp меньше "длины пути до файла", то батник вытягивает файл наверх, т.е. удаляет папки начиная с глубины. и чем больше разница между mp и "длиной пути до файла" тем выше окажется конечный файл. а в решении через Autoit если mp<"длины пути до файла" то скрипт работает некорректно
-----
1. P.S.S. а как удалить файл cmd после выполнения?
del "%$f%" перед chcp866 не помогает
2. P.S.S.S.
вот этот батник сохраняет путь до файла + имя файла.
set f1=1.txt
set f2=2.txt
set mp=100
(for /f "usebackq delims=" %%a in ("%f1%") do @(
set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa))>"%f2%"
а как сделать только путь до файла без добавления имени файла?
я 15 минут игрался с переменными - так и не нашел решение
РЕШЕНИЕ »область действия CHCP должна быть по возможности минимальной... Во-первых, это избавит скрипт от бессмысленных перекодировок и ускорит его работу... Во-вторых, предохранит от глюков в реализации этих перекодировок - далеко не все CMD команды корректно её проводят (FindStr делает это весьма своеобразно), а в некоторых её просто "забыли" реализовать (REG в локализованной WinXP)
как удалить файл cmd после выполнения?
del "%$f%" перед chcp866 не помогает »помогает, нужно только использовать CALL при вызове батника, иначе это будет последней выполненной командой... если лог работы не нужен, можно запустить MOVE на выполнение без вывода в промежуточный файл:
rem.============================&chcp 1251
set $m=C:\Program Files\*.txt
set $f=%~n0_tst.cmd
set mp=100
rem.============================&chcp 866
for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"& call set "c=%%b:~0,%mp%%%"& call call set "d=%%%%b:%%c%%=%%%%"
if defined d call move "%%a" "%%c%%%%~xa")
как сделать только путь до файла без добавления имени файла?»
(for /f "usebackq delims=" %%a in ("2.txt") do @echo %%~dpa)>3.txt
а в решении через Autoit если mp<"длины пути до файла" то скрипт работает некорректно »это решается скурпулезным анализом всех возможных вариантов и четкой формулировкой задачи (грубо говоря, чего заказали то и получили), уже отмечал, что некоторые очевидные ситуации в условии не оговорены, например:
- разные имена файлов могут стать одинаковыми, как должен вести себя скрипт: пропускать файл, перезаписывать последним, выдавать запрос или переименовывать по какому-то правилу?
- имя файла может быть потеряно полностью, каковы действия скрипта: перемещать файл с именем папки или пытаться сохранить хотя бы часть имени файла?... возможны и забавные ситуации типа "C:\DIR1\DIR2\.pdf"
shadowbat
19-06-2010, 06:47
значит получается так?:
РЕШЕНИЕ без лога работы:
rem.============================&chcp 1251
set $m=C:\Program Files\*.txt
set $f=%~n0_tst.cmd
set mp=100
rem.============================&chcp 866
for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"& call set "c=%%b:~0,%mp%%%"& call call set "d=%%%%b:%%c%%=%%%%"
if defined d call move "%%a" "%%c%%%%~xa")
РЕШЕНИЕ с логом работы:
rem.============================&chcp 1251
set $m=C:\Program Files\*.txt
set $f=%~n0_tst.cmd
set mp=100
rem.============================&chcp 866
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"& call set "c=%%b:~0,%mp%%%"& call call set "d=%%%%b:%%c%%=%%%%"
if defined d call echo move "%%a" "%%c%%%%~xa"))>"%$f%"
"%$f%"
amel27, Вы профессионал своего дела!
(for /f "usebackq delims=" %%a in ("2.txt") do @echo %%~dpa)>3.txt
создал новую тему по этому вопросу
set $m=C:\Program Files\*.txt
set $f=2.txt
set mp=50
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa))>"%$f%" »
Пожалуйста, обЪясните происходящее в цикле, а то уже мозг ломается...
by.Serj, если речь про две строки в цикле:
(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(
set "b=%%~dpna"
call echo.%%b:~0,%mp%%%%%~xa
)
)>"%$f%"
присвоение переменной b пути\имени файла (%%a) без расширения:set "b=%%~dpna"
при включенном режиме EnableDelayedExpansion вторая строка имела бы вид:
echo.!b:~0,%mp%!%%~xa
где "%%~xa" - расширение файла (%%a);
"%mp%" - значение переменной mp
"!b:~0,%mp%!" - %mp% первых символов переменной b
чтобы избежать использования EnableDelayedExpansion используем трикс с CALL: добавляем перед командой CALL и заменяем "!" на "%%" (отложенная подстановка), в результате при (первом) вызове CALL будут подставлены значения %%a и %mp%, при (втором) вызове ECHO - значение b
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.