Войти

Показать полную графическую версию : [решено] Имя файла из строки копируемого файла.


Страниц : [1] 2

Seryoga204
24-08-2010, 23:14
Подскажите пожалуйста, можно переименовать все копируемые файлы из директории, чтобы их имена соответствовали тексту содерж. в них самих во второй строке с 10 по 15 знак.

deepred
24-08-2010, 23:44
Seryoga204,

на скорую руку, хотя надо еще попробовать с enableddelayedexpansion. Какая у Вас ОС?
Echo on & [B]Chcp 1251[B]
Set "$SRS=F:\probe\переименование\001" & rem папка источник
Set "$DST=F:\probe\переименование\002" & rem папка приемник

Cd %$SRS%
For /f %%a in ('Dir /b %$SRS%') Do ^
For /f "skip=1" %%b in (%%~a) Do ^
call :RNCOPY "%%b" "%%a"
goto :EOF
:RNCOPY
Set $nm=%~1
Set $nm=%$nm:~9,6%
Copy "%~2" "%$DST%\%$nm%~x2"

Seryoga204
24-08-2010, 23:48
Какая у Вас ОС?
Win XP.SP3
вот log

L:\TOOLS\Print>Echo on & Chcp 866
Текущая кодовая страница: 866

L:\TOOLS\Print>Set $SRS="L:\1" & rem яряър шёЄюіэшъ

L:\TOOLS\Print>Set $DST="L:\2" & rem яряър яЁшхьэшъ

L:\TOOLS\Print>Cd "L:\1"

L:\1>For /F %a in ('Dir /b "L:\1" ') Do For /F "skip=1" %b in (%~a) Do call :RNC
OPY "%b" "%a"

L:\1>For /F "skip=1" %b in (0000) Do call :RNCOPY "%b" "0000"

L:\1>call :RNCOPY "отделы" "0000"

L:\1>Set $nm=отделы

L:\1>Set $nm=

L:\1>Copy "0000" ""L:\2" \~x2"
Системе не удается найти указанный путь.
Скопировано файлов: 0.

Seryoga204
25-08-2010, 00:38
Строка №2 содержит пробелы?
пример: отделы отчетный № 8456/2060
хотелось чтобы файл назывался 2060.txt
"Chcp 1251"
Файлы в досовской кодировке, или это не влияет?

Seryoga204
25-08-2010, 01:44
deepred, Спасибо большое! Подскажите пожалуйста как на первом примере вытащить из файла не первое слово 2-ой строки, а всю строку 1>call :RNCOPY "отделы отчетный № 8456/2060" "0000"

Seryoga204
25-08-2010, 18:54
deepred, Код: Echo on & Chcp 866
Set $SRS="F:\probe\переименование\001"
Set $DST="F:\probe\переименование\002"
Cd %$SRS% For /f %%a in ('Dir /b %$SRS%') Do ^
For /f "skip=1 tokens=2 delims=/" %%b in (%%~a) Do ^
Copy "%%a" "%$DST%\%%b%%~xa"
pause
Почему то берется название не со второй строки, а почти со всех где в тексте есть "/".
Из 20 файлов в папке "F:\probe\переименование\002" появилось 4900 шт.
Первый пример берет название из нужной (из второй строки), но лиш первое слово "отделы", а надо из второй строки : "отделы отчетный № 8456/2060............................" извлечь 2060 (с 24-ого по 27-ой символ). Структура второй строки во всех файлах одинаковая. Буду эксперементировать. Спасибо.

deepred
25-08-2010, 19:24
Seryoga204,

в них самих во второй строке с 10 по 15 знак. »
отделы отчетный № 8456/2060 »
вытащить из файла не первое слово 2-ой строки, а всю строку »
а надо из второй строки : "отделы отчетный № 8456/2060............................" извлечь 2060 (с 24-ого по 27-ой символ) »

приведите, что у Вас во второй строке полностью и пример последующих строк..., на этом раз счет символов именно тот, который нужно извлекать?

Seryoga204
25-08-2010, 19:53
Вот пример файлика, кол-во строк может быть разным, но структура первых трех всегда одинаковая.
в них самих во второй строке с 10 по 15 знак. - обшибся в начале, надо имено
"отделы отчетный № 8456/2060" извлечь 2060 даже не (с 24-ого по 27-ой символ) а с 25-ого по 28-ой символ (там есть два пробела вместе)

deepred
25-08-2010, 20:17
Seryoga204,

попробуйте:
Echo on & Chcp 1251
Setlocal EnabledelayedExpansion
Set "$SRS=F:\probe\переименование\001\" & rem папка источник
Set "$DST=F:\probe\переименование\002\" & rem папка приемник

Cd %$SRS%
For /f %%a in ('Dir /b %$SRS%') Do ^
For /f "skip=1" %%b in (%$SRS%%%~a) Do (
set /a $N+=1
call :RNCOPY "%%b" "%%a")
goto :EOF


:RNCOPY
If /i %$N% GTR 1 set $N=0 & goto :Eof
Set $nm=%~1
Set $nm=%$nm:~23,4%
Copy "%$SRS%%~2" "%$DST%%$nm%%~x2"


предыдущие посты с кодами я удалил - условиям задачи они не соответствуют... (да я уже на них смотрю и не понимаю, что сделать надо было....)

gora
25-08-2010, 20:46
deepred, немного упростил и подправил Ваш вариант:Echo on & Chcp 1251
Setlocal EnabledelayedExpansion
Set "$SRS=F:\probe\переименование\001\" & rem папка источник
Set "$DST=F:\probe\переименование\002\" & rem папка приемник

Cd %$SRS%
For /f %%a in ('Dir /b %$SRS%') Do call :RNCOPY "%%a"
goto :EOF

:RNCOPY
For /f "skip=1 tokens=*" %%b in (%$SRS%%~1) Do (
Set $nm=%%b
Set $nm=!$nm:~24,4!
Copy "%$SRS%%~1" "%$DST%!$nm!%~x1"
goto :Eof
)

deepred
25-08-2010, 21:13
gora,

спасибо, да так действительно попроще, а вот "нововведение" про чтение с 25-го символа я незаметил...

gora
25-08-2010, 21:17
"нововведение" про чтение с 25-го символа я незаметил »
Я взял прикрепленный файл, а в нем вторая строка такова:
Отделы отчетный N 8456/2060

deepred
25-08-2010, 21:48
gora,

да-да, но опять таки - можно было ориентироваться на < "tokens=2 delims=/" >

Seryoga204
25-08-2010, 22:08
Всем спасибо! Все работает отлично.

Seryoga204
04-10-2010, 22:11
Echo on & Chcp 1251
Setlocal EnabledelayedExpansion
Set "$SRS=F:\probe\переименование\001\" & rem папка источник
Set "$DST=F:\probe\переименование\002\" & rem папка приемник
Cd %$SRS% For /f %%a in ('Dir /b %$SRS%') Do call :RNCOPY "%%a"
goto :EOF
:RNCOPY
For /f "skip=1 tokens=*" %%b in (%$SRS%%~1) Do (
Set $nm=%%b
Set $nm=!$nm:~24,4!
Copy "%$SRS%%~1" "%$DST%!$nm!%~x1"
goto :Eof )
Подскажите пожалуйста как сделать чтобы название файла бралось не с одной строки, а с нескольких. Пример текста в файле:

МЕМОРИАЛЬНИЙ ОРДЕР N-R=100211
от 20 июня 2010 г.




000 352200000

Надо чтобы имя получилось "от 20 июня 2010 г._Dt3522_100211.txt", т.е. вторая строка с 17символа(18)&"_Dt"&шестая строка c 48 символа(4)&"_"&первая строка с 39 символа(6).

gora
05-10-2010, 09:48
Seryoga204, сделано по, предоставленному Вами, образцу файла@Echo Off & Chcp 1251>Nul
Setlocal EnabledelayedExpansion
Set "$SRS=F:\probe\переименование\001\" & rem папка источник
Set "$DST=F:\probe\переименование\002\" & rem папка приемник

Cd %$SRS%
For /f %%a in ('Dir /b %$SRS%') Do call :RNCOPY "%%a"
goto :EOF

:RNCOPY
Set cnt=0
For /f "tokens=* delims=" %%b in (%$SRS%%~1) Do (
Set /a cnt+=1
Set $nm=%%b
If !cnt!==1 Set $lin!cnt!=!$nm:~38,6!
If !cnt!==2 Set $lin!cnt!=!$nm:~17,18!
If !cnt!==3 Set $lin!cnt!=!$nm:~43,4!
)
Copy "%$SRS%%~1" "%$DST%!$lin2!_Dt!$lin3!_!$lin1!%~x1">Nul
goto :Eof

Seryoga204
05-10-2010, 20:14
gora,
Спасибо большое!

AlexVong
07-03-2011, 23:31
Подскажите пожалуйста, использую код
Echo on & Chcp 1251
Setlocal EnabledelayedExpansion
Set "$SRS=F:\probe\переименование\001\" & rem папка источник
Set "$DST=F:\probe\переименование\002\" & rem папка приемник

Cd %$SRS%
For /f %%a in ('Dir /b %$SRS%') Do call :RNCOPY "%%a"
goto :EOF

:RNCOPY
For /f "skip=1 tokens=*" %%b in (%$SRS%%~1) Do (
Set $nm=%%b
Set $nm=!$nm:~24,10!
Copy "%$SRS%%~1" "%$DST%!$nm!%~x1"
goto :Eof
)
Под отбор попадает как раз фрагмент строки с датой(типа: 01/01/2011 ), но так как имеет место символ "/", батник не может присвоить данное название файлу, как поступить в таком случае? Чтобы имя файла было 2011-01-01.txt Подскажите пожалуйста.

Iska
08-03-2011, 03:11
AlexVong, попробовать дополнительно воспользоваться заменой «set VarY=%VarX:/=-%»?!
Подстановка переменной среды может быть расширена следующим образом:
%PATH:str1=str2%
расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в расширенном результате на "str2". "str2" может быть пустой строкой для
эффективного удаления вхождений "str1" из расширенного вывода. "str1" может начинаться со звездочки, и в этом случае это будет соответствовать любому началу расширенного вывода до первого вхождения оставшейся части "str1".

Пример:
@echo off
setlocal

set sName=01/01/2011
set sName=%sName:/=-%

echo %sName%

endlocal
exit /b 0

AlexVong
16-03-2011, 19:41
А как сделать чтобы это имя выводилось на экран? Типа "скопирован файл за sName"




© OSzone.net 2001-2012