Войти

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


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

firstarey
08-04-2013, 13:25
Граждане!!
столкнулся с проблемой:

суть:
получить все *.xml файлы в данной папке, отвечающие критериям, в переменную (ну или сразу обработать данный файл)

как делаю:
findstr /m "<Cadastral_Block CadastralNumber=" "*.xml"
результат на экран выводиться как мне нужно, но вот как это в переменную загнать?
каким образом For /F подключить ?

Iska
08-04-2013, 16:41
Например, так:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (`findstr.exe /m "<Cadastral_Block CadastralNumber=" "*.xml"`) do (
echo %%~i
)

endlocal
exit /b 0

firstarey
09-04-2013, 08:58
Iska, Вы не ответили на вопрос и пометили тему решенной.

вопрос именно в том:
как это в переменную загнать? »
надо именно занести в переменную имя XML файла (пусть даже первое из списка выдачи findstr или последнее, после обработки файл будет перемещен, далее снова поиск по findstr и так пока не закончатся xml файлы в папке)

Конструкция вида:
setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in (`findstr.exe /m "<Cadastral_Block CadastralNumber=" "*.xml"`) do (
set file_name=%%~1
echo %%~i
)
pause
echo %file_name%
pause
endlocal
exit /b 0
выдает "%~i"

Возможно я не прав, тогда подправьте ;)

zion87
09-04-2013, 18:22
просто проявите фантазию ))))

setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in (`findstr.exe /m "<Cadastral_Block CadastralNumber=" "*.xml"`) do (
call :1 %%~i
)
goto:eof
endlocal
:1
set file_name=%1
echo %file_name%
pause

Iska
10-04-2013, 02:31
firstarey, именно из-за того, что имена файлов перебираются внутри цикла — либо обрабатывайте их (файлы) там же, внутри цикла, либо выносите обработку в процедуру, вызываемую опять же изнутри цикла (как в примере коллеги zion87 выше).

firstarey
10-04-2013, 08:52
просто проявите фантазию )))) »

спасибо за помощь
фантазия применима когда знаешь как это сделать :))

нафантазировал следующее:
:poisk
if not exist *.xml (
echo обрабатывать то и нечего
echo выход.
pause>nul
exit
)
setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in (`findstr.exe /m "<Cadastral_Block CadastralNumber=" "*.xml"`) do (
echo обрабатываем файл: %%~i
echo --------------------------------------------------------------------------------
call :obrabotka %%~i
)
goto:eof
endlocal

:obrabotka
set file_name=%1

когда в папке не осталось ни одного нужного файла, то встает на паузу

Iska
10-04-2013, 09:20
firstarey, лишнего нафантазировали. Вам имена файлов для чего нужны?

firstarey
10-04-2013, 15:14
Iska, все нормально нафантазировал, далее идет обработка файла:
1. считываем из него значения тегов
:obrabotka
set file_name=%1

rem определяем дату формирования данных:
For /F "Tokens=2-4 Delims=>-<" %%a In ('C:\WINDOWS\system32\find.exe "<Date>" ^<"%File_name%"') Do (
set DY=%%a
set DM=%%b
set DD=%%c
)

rem определяем номер документа:
For /F "Tokens=2 Delims=><" %%a In ('C:\WINDOWS\system32\find.exe "<Number>" ^<"%File_name%"') Do set Doc_Number=%%a
2. определяем тип документа (возможно 4 варианта)
3. перемещаем документ в каталог согласно заданной структуре папок
4. goto :poisk

p.s. если вдруг интересно могу выложить все целиком

Iska
10-04-2013, 16:31
firstarey, зачем Вам «goto :poisk», если все xml и так выбираются одним-единственным приведённым циклом?

firstarey
11-04-2013, 06:43
Iska, выбираются то все, а имя берем одно, с ним работаем, перемещаем, потом снова выбираем все...

в данном варианте ЭТО работает. в моем случае актуальна фраза "плохой код, который работает, лучше чем красивый код, который не работает"
(это я к тому, что возможно Вы увидите тут какие либо не совсем рациональные пути решения)

Привожу весь батник 97239, дабы было понятней как это происходит.

p.s.
сейчас вся проблема в том, что ко мне xml файлы попадают в виде "однострочного"
приходиться блокнотом заменять "><" на ">/n<" лишь потом возможно обработать bat-ником

Iska
11-04-2013, 10:56
Iska, выбираются то все, а имя берем одно, с ним работаем, перемещаем, потом снова выбираем все...
в данном варианте ЭТО работает. в моем случае актуальна фраза "плохой код, который работает, лучше чем красивый код, который не работает"
(это я к тому, что возможно Вы увидите тут какие либо не совсем рациональные пути решения) »
Вы правы, вижу. Дело не в красоте, а в ненужных костылях.

Привожу весь батник Файл 97239, дабы было понятней как это происходит. »
«Страница не найдена».

firstarey
11-04-2013, 11:12
«Страница не найдена». »
странно, у меня предлагает сохранить архив.

еще разок:
97252
и на всякий случай:
http://anonymousdelivers.us/44622

Iska
11-04-2013, 13:24
еще разок: тест.zip »
Теперь доступен.

firstarey
12-04-2013, 13:57
Iska, есть идеи ?

Iska
13-04-2013, 15:21
firstarey, моя идея была изложена выше несколько раз: нет нужды в «ручном» цикле по «goto :poisk», поскольку «findstr.exe /m "<Cadastral_Block CadastralNumber=" "*.xml"» и так выбирает все потребные xml-файлы.

sov44
03-07-2013, 21:18
Подскажите, как избавится от сообщения "FINDSTR: // пропускается" http://savepic.org/3898391.jpg
@echo off

:: Папка, в которой нужно искать
set "sDir=c:\2\евеве"

:: Параметрами проставить нужные расширения
for /r "%sDir%" %%a in (.) do call:1 "%%~dpna" zip
pause
goto:eof

:1
if not "%2"=="" (
for /f "tokens=1* delims=:" %%i in (
'dir /b /a-d "%~1\*.%2" 2^>nul ^| findstr /i/n "\.%2$" ^| findstr /vc:"%~n1" 2^>Nul'
) do echo ren "%~1\%%j" "%~n1-%%i.%2" 2>nul
shift /2
goto 1
)

sov44
09-08-2013, 16:21
Необходимо вывести имена файлов, начинающиеся с цифры или с буквы в нижнем регистре?
for /f "delims=" %%a in ('dir /b /s /a-d "%windir%\Installer\*" ^|findstr /rc:"[0-9]*.msp"') do echo %%a

Iska
09-08-2013, 18:56
/rc:"[0-9]*.msp"
означает: найти строки, содержащие любое количество подряд идущих цифр, за ними один любой символ, затем символы «msp».

sov44
09-08-2013, 19:26
означает: найти строки, содержащие любое количество подряд идущих цифр, за ними один любой символ, затем символы «msp». »
Фактически выводит имена файлов, начинающихся как с цифр, так и с букв.
Iska, как насчёт решения ТЗ в посте 17?

Iska
09-08-2013, 19:38
Необходимо вывести имена файлов, начинающиеся с цифры или с буквы в нижнем регистре »
sov44, для Вашего случая — например, так:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "delims=" %%i in (
'dir /b /s /a:-d "*.*" ^| findstr.exe /r /c:"^.*\\[0-9a-z][^\\]*\.[^\.\\]*$"'
) do echo %%i

endlocal
exit /b 0


Фактически выводит имена файлов, начинающихся как с цифр, так и с букв. »
А что Вы хотели — маска ищет в строках, а у Вас строки — полные пути, а не только имена файлов.

И, ещё например, такое:
D:\bla-bla-bla Вася Пупкин 123 ха-ха 3рmsp.exe
вполне уложится в указанную Вами маску.




© OSzone.net 2001-2012