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

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

firstarey 08-04-2013 13:25 2128174

findstr помощь
 
Граждане!!
столкнулся с проблемой:

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

как делаю:
Код:

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

Iska 08-04-2013 16:41 2128314

Например, так:
Код:

@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 2128703

Iska, Вы не ответили на вопрос и пометили тему решенной.

вопрос именно в том:
Цитата:

Цитата firstarey
как это в переменную загнать? »

надо именно занести в переменную имя 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 2129128

просто проявите фантазию ))))
Код:

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 2129417

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

firstarey 10-04-2013 08:52 2129491

Цитата:

Цитата zion87
просто проявите фантазию )))) »

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

нафантазировал следующее:
читать дальше »
Код:

: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 2129518

firstarey, лишнего нафантазировали. Вам имена файлов для чего нужны?

firstarey 10-04-2013 15:14 2129771

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 2129819

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

firstarey 11-04-2013 06:43 2130170

Iska, выбираются то все, а имя берем одно, с ним работаем, перемещаем, потом снова выбираем все...

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

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

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

Iska 11-04-2013 10:56 2130271

Цитата:

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

Вы правы, вижу. Дело не в красоте, а в ненужных костылях.

Цитата:

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

«Страница не найдена».

firstarey 11-04-2013 11:12 2130279

Цитата:

Цитата Iska
«Страница не найдена». »

странно, у меня предлагает сохранить архив.

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

Iska 11-04-2013 13:24 2130352

Цитата:

Цитата firstarey
еще разок: тест.zip »

Теперь доступен.

firstarey 12-04-2013 13:57 2131020

Iska, есть идеи ?

Iska 13-04-2013 15:21 2131649

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

sov44 03-07-2013 21:18 2178862

Подскажите, как избавится от сообщения "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 2199088

Необходимо вывести имена файлов, начинающиеся с цифры или с буквы в нижнем регистре?
Код:

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 2199165

Код:

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

sov44 09-08-2013 19:26 2199188

Цитата:

Цитата Iska
означает: найти строки, содержащие любое количество подряд идущих цифр, за ними один любой символ, затем символы «msp». »

Фактически выводит имена файлов, начинающихся как с цифр, так и с букв.
Iska, как насчёт решения ТЗ в посте 17?

Iska 09-08-2013 19:38 2199204

Цитата:

Цитата sov44
Необходимо вывести имена файлов, начинающиеся с цифры или с буквы в нижнем регистре »

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

Цитата:

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

А что Вы хотели — маска ищет в строках, а у Вас строки — полные пути, а не только имена файлов.

И, ещё например, такое:
Код:

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

sov44 09-08-2013 20:10 2199227

Попробовал изменить скрипт под ТЗ
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

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

однако, к сожалению, скрипт вывел имена файлов, начинающихся с верхнего регистра http://savepic.ru/4659738.jpg
Iska, не могли бы вы разъяснить регулярные выражения в скрипте?

Iska 10-08-2013 00:41 2199354

sov44, к сожалению, подтверждаю.

Цитата:

Цитата sov44
Iska, не могли бы вы разъяснить регулярные выражения в скрипте? »

Код:

^.*\\[0-9a-z][^\\]*\.[^\.\\]*$
«^»/«$» — начало/конец строки;
произвольное количество любых символов;
экранированный обратный слэш;
один символ из указанного диапазона;
произвольное число (в том числе и пустое) символов, не содержащих обратный слэш;
точка;
произвольное число (в том числе и пустое) символов, не содержащих точки и обратного слэша.

Так это мыслилось. Очевидно, не всё гоже для «findstr.exe».

sov44, переходите на PowerShell. Рекурсивная обработка, работа с регулярками — это его «коньки». Смотрите, как всё просто и замечательно:
Код:

Get-ChildItem -Recurse -Include *.msp |`
    ForEach-Object -Process {
        if($_.Name -cmatch "^[0-9a-z].*\.[^\.]*$") {
            $_.FullName
        }
    }


Foreigner 10-08-2013 10:09 2199406

Iska, Можно с помощью Select-String (sls) -- аналога findstr или grep:
Код:

(gci *.msp -rec).fullname | sls -case '^.*\\[0-9a-z][^\\]*\.msp$'

Iska 10-08-2013 10:52 2199421

Foreigner, мне показалось нагляднее использовать свойство «.Name».

amel27 10-08-2013 20:16 2199594

Цитата:

Цитата Iska
не всё гоже для «findstr.exe»»

если речь про интервалы в классе, то у FINDSTR своя логика:
[a-z] соответствует интервалу ряда [aAbBcC ... xXyYzZ], т.е.:

- символ Z выпадает из такого интервала, правильно будет [a-Z] ))
- интервал класса нормально работает для символов, не являющихся буквами;
- регистрозависимый интервал требует тупого перечисления БУКВ;

- для русских букв можно использовать трикс с WIN-кодировкой

P.S. воздержусь от примеров - не в том состоянии)

sov44 11-10-2013 14:53 2232694

Как вывести имя папки типа 05CE87A7-5F0B-4D90-BC77-81F960F22584 в директории %temp% windows7, чтобы в дальнейшем её удалить?
Не работает, видимо не до конца разобрался с регулярными выражениями
Код:

findstr /rc:".*-*" "%temp%"
pause

глобальная задача тут http://forum.oszone.net/thread-267542.html

Iska 12-10-2013 12:17 2233097

Цитата:

Цитата sov44
Как вывести имя папки типа 05CE87A7-5F0B-4D90-BC77-81F960F22584 в директории %temp% windows7, чтобы в дальнейшем её удалить? »

sov44, если они все создаются по общему принципу, то, например, так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
        `2^>nul dir /b /a:d "%temp%\*." ^| findstr.exe /r /c:"^........-....-....-....-............$"`
) do echo rd /s /q "%temp%\%%~i"

endlocal
exit /b 0

Обратите внимание ещё на два момента: атрибуты каталога (добавьте параметр, если там нечто из набора «hsr»), и количество таких папок в «%temp%» — как определить, что найденная папка — искомая? Как обычно, уберите echo для реального удаления.

Update: посмотрел сейчас с помощью «GUIDGEN.EXE» — формат действительно единый.


Время: 16:46.

Время: 16:46.
© OSzone.net 2001-