Поиск подстроки в строке в CMD

Есть список баз в файле db.txt. Вот его содержание
DOC
VOC
DAT1
DAT2
DAT3
DAT4

Пробегаюсь по нему
for /f "tokens=1 delims=/.- " %%a in ('type db.txt') do ( )

Надо, например, вывести только базы начинающиеся с DAT. Я нашёл как найти подстроку
echo %%a | findstr /i DAT

И вот вопрос, как мне результат поиска подстроки подставить в конструкцию IF?
Заранее спасибо! 8-)
  • Вопрос задан
  • 24766 просмотров
Решения вопроса 1
ntkt
@ntkt
Потомственный рыцарь клавиатуры и паяльника
0) Идея: в каждом IF'е брать подстроку. К сожалению, подстроку в цикле взять довольно сложно (даже enabledelayedexpansion не помогает, плюс прочие багофичи), но мы можем снова заюзать findstr по строке! (echo ololo | findstr lol > NUL)

1) findstr устанавливает return code при выходе (а он записывается шеллом в ERRORLEVEL). 0 == нашел, 1 == не нашел

2) ERRORLEVEL работает довольно интересно:
условие вида IF NOT ERRORLEVEL 1 это значит ERRORLEVEL == 0 :)

3) Собираем все вместе:
@echo off
set usr=%1
for /f "tokens=1 delims=/.- " %%a in ('type db.txt') do (
echo %%a | findstr VOC > NUL
if NOT ERRORLEVEL 1 (
echo TEST! with %%a we do:
echo TEST! db2 grant execute on function "WEB.F1(INTEGER)" to user %usr% with grant option
echo TEST! db2 grant execute on function "WEB.F2(INTEGER)" to user %usr% with grant option
echo TEST! 
) else (
echo %%a | findstr DAT > NUL
if NOT ERRORLEVEL 1 (
echo TEST! with %%a we do:
echo TEST! db2 grant execute on function "WEB.F3(INTEGER)" to user %usr% with grant option
echo TEST! 
)
)
)


Результат:
B:\>test.bat user1                                                                                               
TEST! with VOC we do:                                                                                            
TEST! db2 grant execute on function "WEB.F1(INTEGER)" to user user1 with grant option                            
TEST! db2 grant execute on function "WEB.F2(INTEGER)" to user user1 with grant option                            
TEST!                                                                                                            
TEST! with DAT1 we do:                                                                                           
TEST! db2 grant execute on function "WEB.F3(INTEGER)" to user user1 with grant option                            
TEST!                                                                                                            
TEST! with DAT2 we do:                                                                                           
TEST! db2 grant execute on function "WEB.F3(INTEGER)" to user user1 with grant option                            
TEST!                                                                                                            
TEST! with DAT3 we do:                                                                                           
TEST! db2 grant execute on function "WEB.F3(INTEGER)" to user user1 with grant option                            
TEST!                                                                                                            
TEST! with DAT4 we do:                                                                                           
TEST! db2 grant execute on function "WEB.F3(INTEGER)" to user user1 with grant option                            
TEST!                                                                                                            
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Spetros
@Spetros
IT-шник
Согласно справке из findstr /? результат запуска:
findstr /b DAT

выведет строки начинающиеся на DAT.
Соответственно, ваш скрипт будет иметь вид:
for /f "tokens=1 delims=/.- " %%a in ('type db.txt') do (echo %%a | findstr /b DAT)

В принципе, этот скрипт можно даже сделать более универсальным, передавая скрипту искомое значение в виде параметра к нему:
for /f "tokens=1 delims=/.- " %%a in ('type db.txt') do (echo %%a | findstr /b %1)
Ответ написан
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Откройте для себя повершелл со всей дурью Net, в том числе с подстроками, регекспами (http://xaegr.wordpress.com/2010/04/09/regexp-8-regex/)
.
foreach ($line in Read-content filesource.txt)
{

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы