Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] обрезать по заданному MAX PATH

Ответить
Настройки темы
CMD/BAT - [решено] обрезать по заданному MAX PATH

Старожил


Сообщения: 267
Благодарности: 8

Профиль | Отправить PM | Цитировать


есть список


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


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


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

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

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

Отправлено: 11:51, 18-06-2010

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:10, 18-06-2010 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 267
Благодарности: 8

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:13, 18-06-2010 | #12


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


shadowbat, кодировка самого батника DOS (866)? (блокнот не катит)
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:25, 18-06-2010 | #13


Старожил


Сообщения: 267
Благодарности: 8

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось shadowbat, 18-06-2010 в 20:07.


Отправлено: 18:58, 18-06-2010 | #14


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата 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"
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:01, 19-06-2010 | #15


Старожил


Сообщения: 267
Благодарности: 8

Профиль | Отправить PM | Цитировать


значит получается так?:
РЕШЕНИЕ без лога работы:
читать дальше »
Код: Выделить весь код
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
создал новую тему по этому вопросу

Последний раз редактировалось shadowbat, 19-06-2010 в 07:14.


Отправлено: 06:47, 19-06-2010 | #16


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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%" »
Пожалуйста, обЪясните происходящее в цикле, а то уже мозг ломается...

Отправлено: 18:37, 07-07-2010 | #17


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:04, 08-07-2010 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] обрезать по заданному MAX PATH

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Высокий приоритет заданному процессу 7human7 Скриптовые языки администрирования Windows 14 26-01-2012 16:34
...cannot find the specified path... - перенаправление? semiono Автоматическая установка Windows 2000/XP/2003 1 09-04-2010 01:43
Удаление записей из таблицы по заданному времени на php magwolf Вебмастеру 5 14-08-2009 14:13
Win2003 и Max CPUID max to 3 3au4er Microsoft Windows NT/2000/2003 0 06-08-2008 12:13
Поиск элементов массива, чья сумма равна заданному числу Qwe1 Программирование и базы данных 28 26-09-2006 03:31




 
Переход