Показать полную графическую версию : [решено] findstr помощь
firstarey
08-04-2013, 13:25
Граждане!!
столкнулся с проблемой:
суть:
получить все *.xml файлы в данной папке, отвечающие критериям, в переменную (ну или сразу обработать данный файл)
как делаю:
findstr /m "<Cadastral_Block CadastralNumber=" "*.xml"
результат на экран выводиться как мне нужно, но вот как это в переменную загнать?
каким образом For /F подключить ?
Например, так:
@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"
Возможно я не прав, тогда подправьте ;)
просто проявите фантазию ))))
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
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
когда в папке не осталось ни одного нужного файла, то встает на паузу
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. если вдруг интересно могу выложить все целиком
firstarey, зачем Вам «goto :poisk», если все xml и так выбираются одним-единственным приведённым циклом?
firstarey
11-04-2013, 06:43
Iska, выбираются то все, а имя берем одно, с ним работаем, перемещаем, потом снова выбираем все...
в данном варианте ЭТО работает. в моем случае актуальна фраза "плохой код, который работает, лучше чем красивый код, который не работает"
(это я к тому, что возможно Вы увидите тут какие либо не совсем рациональные пути решения)
Привожу весь батник 97239, дабы было понятней как это происходит.
p.s.
сейчас вся проблема в том, что ко мне xml файлы попадают в виде "однострочного"
приходиться блокнотом заменять "><" на ">/n<" лишь потом возможно обработать bat-ником
Iska, выбираются то все, а имя берем одно, с ним работаем, перемещаем, потом снова выбираем все...
в данном варианте ЭТО работает. в моем случае актуальна фраза "плохой код, который работает, лучше чем красивый код, который не работает"
(это я к тому, что возможно Вы увидите тут какие либо не совсем рациональные пути решения) »
Вы правы, вижу. Дело не в красоте, а в ненужных костылях.
Привожу весь батник Файл 97239, дабы было понятней как это происходит. »
«Страница не найдена».
firstarey
11-04-2013, 11:12
«Страница не найдена». »
странно, у меня предлагает сохранить архив.
еще разок:
97252
и на всякий случай:
http://anonymousdelivers.us/44622
еще разок: тест.zip »
Теперь доступен.
firstarey
12-04-2013, 13:57
Iska, есть идеи ?
firstarey, моя идея была изложена выше несколько раз: нет нужды в «ручном» цикле по «goto :poisk», поскольку «findstr.exe /m "<Cadastral_Block CadastralNumber=" "*.xml"» и так выбирает все потребные xml-файлы.
Подскажите, как избавится от сообщения "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
)
Необходимо вывести имена файлов, начинающиеся с цифры или с буквы в нижнем регистре?
for /f "delims=" %%a in ('dir /b /s /a-d "%windir%\Installer\*" ^|findstr /rc:"[0-9]*.msp"') do echo %%a
/rc:"[0-9]*.msp"
означает: найти строки, содержащие любое количество подряд идущих цифр, за ними один любой символ, затем символы «msp».
означает: найти строки, содержащие любое количество подряд идущих цифр, за ними один любой символ, затем символы «msp». »
Фактически выводит имена файлов, начинающихся как с цифр, так и с букв.
Iska, как насчёт решения ТЗ в посте 17?
Необходимо вывести имена файлов, начинающиеся с цифры или с буквы в нижнем регистре »
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.