Показать полную графическую версию : создание 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.