Войти

Показать полную графическую версию : создание txt файлов по маске *_i.ext


shadowbat
03-01-2015, 19:08
Здравствуйте!
подскажите как создать пустые txt файлы
пользователем задается например i1 = 0, i2 = 2
маска в виде "_i.Extension"
и батник должен создать все недостающие файлы в папке с хвостиком от 0 до 2
http://s020.radikal.ru/i706/1501/a1/9001782c3252.jpg

shadowbat
04-01-2015, 09:49
блок схема под спойлером:
цветным фоном показаны циклы (в данном случае два)
http://s40.radikal.ru/i087/1501/f7/7b0becc4e735.png

Foreigner
04-01-2015, 10:23
Приблизительно:

@echo off
setlocal

pushd d:\test

set a=0
set z=3

for /f "tokens=*" %%i in ('dir /b /a-d') do call:1 "%%i"

popd
goto:eof

:1

for /f "tokens=1 delims=_" %%i in ("%~n1") do (

for /l %%j in (%a%,1,%z%) do (

if not exist "%%i_%%j.*" cd.>"%%i_%%j.txt"

))

В файлах в папке d:\test не должно быть более одного "_" (перед номером). Иначе это потребует дополнительной проверки

shadowbat
04-01-2015, 10:46
спасибо
не должно быть более одного "_" (перед номером)
если есть Fi_1le_0.jpg, то создаются файлы Fi_0.txt Fi_1.txt Fi_2.txt
таким образом решение как бы рабочее, но на практике, когда файлов много и нельзя контролировать их названия, то как добавить в bat файл эту самую дополнительную проверку или работу именно с последним символом в имени файла согласно блок схеме?

в принципе можно не делать проверку на "_символ.расширение", а работать сразу напрямую с последним символом перед расширением.
приняв за правило, что все файлы имеют число на конце
например есть файл File1.jpg - и создать файлы File0.txt и File2.txt

Foreigner
04-01-2015, 12:23
shadowbat, Вот такая портянка:

@echo off
setlocal

pushd d:\test

set "a=0"
set "z=3"

for /f "tokens=*" %%i in ('dir /b /a-d') do call:1 "%%i"

popd
goto:eof

:1

set "t="
set "check=0"

set "f=%~n1"
set "f=%f: =?%"
set "f=%f:,=:%"

for %%i in (%f:_=,%) do set /a t+=1

for /f "tokens=%t% delims=_" %%i in ("%~n1") do (

set "last=%%i"

if not %%i==0 (

for /f %%j in ('set /a %%i-1') do set "check=%%j"

))

if not "%check%"=="-1" (call:2 %1) else (call:3 %1)

goto:eof

:2
setlocal enabledelayedexpansion

set "remove=%last%%~x1"
set "name=%~1"

for /l %%i in (%a%,1,%z%) do (

if not exist "!name:%remove%=!%%i.*" cd.>"!name:%remove%=!%%i.txt"

)

endlocal
goto:eof

:3

if not exist "%~n1_%a%%~x1" ren %1 "%~n1_%a%%~x1"

for /l %%i in (%a%,1,%z%) do (

if not exist "%~n1_%%i.*" cd.>"%~n1_%%i.txt"

)

shadowbat
04-01-2015, 14:55
не работает если пробел в имени файла
файл Fi le_0.png
создаются Fi le_0.png2.txt и Fi le_0.png3.txt

может быть поможет подобная тема (http://forum.oszone.net/thread-293433-2.html), в которой найдено решение на второй стр . (работает и с пробелами в имени файла и с несколькими "_" например Fi_1le_0.jpg)

shadowbat
11-01-2015, 12:26
значит файлы с пробелами в имени никак не будут работать?
так то портянка хорошая, рабочая
http://s018.radikal.ru/i524/1501/3e/d788d04a5ee0.jpg

Foreigner
11-01-2015, 14:30
Я уже если честно потерял ход мыслей на эту тему :unsure:
Попробуйте такой вариант. Будет создавать нулевые файлы по порядку без сортировки по расширениям.

@echo off
setlocal

pushd d:\test

set "a=0"
set "z=5"

for /f "tokens=*" %%i in ('dir /b') do call:1 "%%i"
popd
goto:eof

:1
for /f "tokens=*" %%i in ('dir /b "%~n1.*"') do (

for /l %%j in (%a%,1,%z%) do (

if not exist "%~n1_%%j.*" cd.>"%~n1_%%j%~x1"

))

shadowbat
13-01-2015, 09:52
кто-то отметил тему решенной? я не отмечал. код выше (третий) просто создаёт 5 файлов без фильтрации т.е. совсем не то,что нужно. код портянка (второй) работает как надо, но не учитывает пробелов




© OSzone.net 2001-2012