Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] обрезать по заданному MAX PATH (http://forum.oszone.net/showthread.php?t=178503)

shadowbat 18-06-2010 11:51 1436632

обрезать по заданному MAX PATH
 
есть список


я нашел как только обрезать длину файла. т.е.:


а нужно именно обрезать по длине пути т.е. уровнять MAX PATH


1. причем желательно:
чтобы я мог выбрать длину MAX PATH до которого нужно обрезать
(т.е. нужно не до 255 а скажем до 200 чтобы при копировании файлов в другое место был разбег для глубины)

2. и обязательно сохранение расширения файла.

3. как сделать чтобы захватывались для обработки длины MAX PATH только файлы с расширением pdf ?

amel27 18-06-2010 12:17 1436664

Код:

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 1436683

Цитата:

Цитата amel27
ёпрст, откуда мода пошла текст картинками вставлять?.. прям хоть FineReader ставь »

это специально, потому что если скопировать текстом одинаковые по длине 3 строки то они будут разные в итоге по длине визуально.
...проверил - тут вставляется правильно, а на руборде я вставил 3 строки по 100 символов а в итоге они показывалиь с визуально разной длиной. поэтому вставил картинкой


Цитата:

Цитата shadowbat
есть список

P.s. я допустил ошибку. =) есть не список а есть файлы и их нужно обрезать по длине MAX PATH через переименование например.
(с сохранением пути нахождения файла)

нужно сохранить структуру папок. там около 1800 путей с папками, подпапками и в конце пути один файл txt
т.е. количество путей с папками = количеству файлов, которые нужно обрезать

по поводу поиска например использовать такой алгоритм получится?:
Код:

поиск файла *.txt
возвращение max path
переименовка
продолжить поиск


amel27 18-06-2010 12:51 1436704

Цитата:

Цитата shadowbat
есть не список а есть файлы »

Код:

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. как бы после такого укорачивания имен не возникли "дубли"

Цитата:

Цитата shadowbat
если скопировать текстом одинаковые по длине 3 строки то они будут разные в итоге по длине визуально »

для этого есть тег CODE

NiOl 18-06-2010 12:54 1436706

amel27, 5 минут тупил над "волшебной" строкой, удовлетворенно крякнув процетировал д.Ватсона: "Но черт возьми, КАК?!!!" (в смысле "оно еще и работает")

shadowbat, Вы кажется говорили про pdf, а сейчас уже про txt...

shadowbat 18-06-2010 12:55 1436707

Цитата:

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 самый простой и главное удобный когда нужно без заморочек сделать листинг файлов !


Цитата:

Цитата NiOl
shadowbat, Вы кажется говорили про pdf, а сейчас уже про txt... »

разницы ведь нет. расширение задается в самом коде

shadowbat 18-06-2010 13:57 1436757

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

=) в гугле поиск по фразе "max path" + "только на русском" выдает первую же ссылку в эту тему

shadowbat 18-06-2010 16:24 1436876

не знаю помогут тут или нет реализовать через BAT/CMD, но если кому то тоже понадобится такая MAX_PATH обрезка - мне помогли в соседней ветке
AutoIt-решение от Creator'a http://forum.oszone.net/post-1436849.html#post1436849

amel27 18-06-2010 16:50 1436891

Цитата:

Цитата shadowbat
кто может помочь? »

слишком часто меняете условие задачи - не успеваю править батник,
вариант с выводом в "*_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%"

Цитата:

Цитата shadowbat
мне помогли в соседней ветке »

вы еще попросите на VBS... и в "программировании" на Си... и на Delphi... вдруг кому понадобится (см. п.2.2 правил)

shadowbat 18-06-2010 17:05 1436903

Цитата:

Цитата amel27
вариант с выводом в "*_TST.CMD" (для ознакомления перед запуском): »

наверняка я что то не так понял. изменил C:\Program Files\ на нужные различные пути - в любом случае создается _tst.cmd пустой размером 0кб. а имена файлов не изменяются

Цитата:

Цитата amel27
(см. п.2.2 правил)

ок. больше не повторится

amel27 18-06-2010 17:10 1436908

shadowbat, в файл выводятся только файлы, длина пути которых (без расширения) превышает заданный лимит

shadowbat 18-06-2010 18:13 1436943

я так понял папка из которой запускается батник не важна.
при таком коде создается пустой 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%"


amel27 18-06-2010 18:25 1436949

shadowbat, кодировка самого батника DOS (866)? (блокнот не катит)

shadowbat 18-06-2010 18:58 1436974

Цитата:

Цитата amel27
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 минут игрался с переменными - так и не нашел решение

amel27 19-06-2010 05:01 1437245

Цитата:

Цитата shadowbat
РЕШЕНИЕ »

область действия CHCP должна быть по возможности минимальной... Во-первых, это избавит скрипт от бессмысленных перекодировок и ускорит его работу... Во-вторых, предохранит от глюков в реализации этих перекодировок - далеко не все CMD команды корректно её проводят (FindStr делает это весьма своеобразно), а в некоторых её просто "забыли" реализовать (REG в локализованной WinXP)
Цитата:

Цитата shadowbat
как удалить файл 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")


Цитата:

Цитата shadowbat
как сделать только путь до файла без добавления имени файла?»

Код:

(for /f "usebackq delims=" %%a in ("2.txt") do @echo %%~dpa)>3.txt
Цитата:

Цитата shadowbat
а в решении через Autoit если mp<"длины пути до файла" то скрипт работает некорректно »

это решается скурпулезным анализом всех возможных вариантов и четкой формулировкой задачи (грубо говоря, чего заказали то и получили), уже отмечал, что некоторые очевидные ситуации в условии не оговорены, например:
- разные имена файлов могут стать одинаковыми, как должен вести себя скрипт: пропускать файл, перезаписывать последним, выдавать запрос или переименовывать по какому-то правилу?
- имя файла может быть потеряно полностью, каковы действия скрипта: перемещать файл с именем папки или пытаться сохранить хотя бы часть имени файла?... возможны и забавные ситуации типа "C:\DIR1\DIR2\.pdf"

shadowbat 19-06-2010 06:47 1437257

значит получается так?:
РЕШЕНИЕ без лога работы:
читать дальше »
Код:

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, Вы профессионал своего дела!

Цитата:

Цитата amel27
(for /f "usebackq delims=" %%a in ("2.txt") do @echo %%~dpa)>3.txt

создал новую тему по этому вопросу

by.Serj 07-07-2010 18:37 1449151

Цитата:

Цитата shadowbat
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%" »

Пожалуйста, обЪясните происходящее в цикле, а то уже мозг ломается...

amel27 08-07-2010 06:04 1449419

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


Время: 05:51.

Время: 05:51.
© OSzone.net 2001-