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

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

Seryoga204 24-08-2010 23:14 1481032

Имя файла из строки копируемого файла.
 
Подскажите пожалуйста, можно переименовать все копируемые файлы из директории, чтобы их имена соответствовали тексту содерж. в них самих во второй строке с 10 по 15 знак.

deepred 24-08-2010 23:44 1481050

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 1481052

Цитата:

Какая у Вас ОС?
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 1481079

Цитата:

Строка №2 содержит пробелы?
пример: отделы отчетный № 8456/2060
хотелось чтобы файл назывался 2060.txt
Цитата:

"Chcp 1251"
Файлы в досовской кодировке, или это не влияет?

Seryoga204 25-08-2010 01:44 1481104

deepred, Спасибо большое! Подскажите пожалуйста как на первом примере вытащить из файла не первое слово 2-ой строки, а всю строку
Код:

1>call :RNCOPY "отделы отчетный № 8456/2060" "0000"

Seryoga204 25-08-2010 18:54 1481597

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 1481622

Seryoga204,

Цитата:

Цитата Seryoga204
в них самих во второй строке с 10 по 15 знак. »

Цитата:

Цитата Seryoga204
отделы отчетный № 8456/2060 »

Цитата:

Цитата Seryoga204
вытащить из файла не первое слово 2-ой строки, а всю строку »

Цитата:

Цитата Seryoga204
а надо из второй строки : "отделы отчетный № 8456/2060............................" извлечь 2060 (с 24-ого по 27-ой символ) »

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

Seryoga204 25-08-2010 19:53 1481642

Вложений: 1
Вот пример файлика, кол-во строк может быть разным, но структура первых трех всегда одинаковая.
Цитата:

в них самих во второй строке с 10 по 15 знак.
- обшибся в начале, надо имено
Цитата:

"отделы отчетный № 8456/2060" извлечь 2060 даже не (с 24-ого по 27-ой символ) а с 25-ого по 28-ой символ (там есть два пробела вместе)

deepred 25-08-2010 20:17 1481654

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 1481681

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 1481703

gora,

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

gora 25-08-2010 21:17 1481704

Цитата:

Цитата deepred
"нововведение" про чтение с 25-го символа я незаметил »

Я взял прикрепленный файл, а в нем вторая строка такова:
Код:

Отделы отчетный N  8456/2060

deepred 25-08-2010 21:48 1481726

gora,

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

Seryoga204 25-08-2010 22:08 1481736

Всем спасибо! Все работает отлично.

Seryoga204 04-10-2010 22:11 1511464

Код:

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 1511698

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 1512189

gora,
Спасибо большое!

AlexVong 07-03-2011 23:31 1629580

Подскажите пожалуйста, использую код
Код:

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 1629713

AlexVong, попробовать дополнительно воспользоваться заменой «set VarY=%VarX:/=-%»?!
Цитата:

Цитата set /?
Подстановка переменной среды может быть расширена следующим образом:
Код:

%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 1636448

А как сделать чтобы это имя выводилось на экран? Типа "скопирован файл за sName"

Iska 16-03-2011 21:15 1636554

Код:

echo скопирован файл за %sName%


Время: 14:25.

Время: 14:25.
© OSzone.net 2001-